Может ли прерванный поток Java действительно пропустить предложение finally?

Я просматривал часто повторяющийся слух о том, что потоки демона на JVM обрабатывают блоки finally каким-то особым образом (они не делают, нормально?), когда я читаю это, от учебник Oracle Java:

Примечание. Если JVM завершает выполнение кода try или catch, то блок finally может не выполняться. Аналогично, если поток, выполняющий код try или catch, прерван или убит, блок finally может не выполняться, даже если приложение в целом продолжается.

(Акцент - мой.) И немного о прерывании поймал мой взгляд!

Я убежден, что если поток находится в коде try/catch и прерван, то либо мы (или, в конечном счете, вводим) состояние (например, sleep, wait), где мы заканчиваем тем, что бросаем InterruptedException, или мы не находимся, и мы выпадаем нормально или ненормально, но во всех случаях мы попадаем в предложение finally.

Что я пропустил? Есть ли способ прервать поток, а затем пропустить finally, пока приложение продолжается?

Ответы

Ответ 1

Поскольку вы специально задаете вопрос о потоках daemon: помните, что потоки демона уходят, когда поток nnnemon последнего jvm завершается, поэтому в этом случае поток демона может умереть без выполнения блоков finally (или любого другого кода, который он собирался выполнить, там ничего особенного в блоках finally). Не используйте нить демона для чего-то, что вы не против сбросить на пол, когда jvm завершается.

В противном случае прерывание не делает ничего для сокращения блоков finally. Точка прерывания состоит в том, что прерванный поток контролируется и может завершить свое выполнение, включая закрытие ресурсов, однако это необходимо.

Учебники могут быть очень полезными, но они не являются авторитетными. Формулировка в этом случае использует прерванное слово, в этом контексте представляется разумным предположить, что оно относится конкретно к прерыванию потока, что неверно.