Может ли прерванный поток 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. Точка прерывания состоит в том, что прерванный поток контролируется и может завершить свое выполнение, включая закрытие ресурсов, однако это необходимо.
Учебники могут быть очень полезными, но они не являются авторитетными. Формулировка в этом случае использует прерванное слово, в этом контексте представляется разумным предположить, что оно относится конкретно к прерыванию потока, что неверно.