当我从the Oracle Java tutorial读到这篇文章时,我正在检查JVM中的守护程序线程是否以某种特殊方式处理finally
块(它们没有,好吗?)。
注意:如果在执行
try
或catch
代码时JVM退出,则finally
块可能无法执行。同样,如果执行try
或catch
代码的线程中断或被杀死,则finally
块可能无法执行,即使整个申请仍在继续。
(重点是我的。)关于打断的一点引起了我的注意!
我的信念是,如果一个线程在try / catch代码中并且被中断,那么我们要么(或最终进入)状态(例如睡眠,等待),我们最终会抛出InterruptedException
,或者我们不是,我们正常或异常退出,但在所有情况下,我们将点击finally
条款。
我错过了什么?在应用程序继续运行时,是否真的有一种方法可以让线程被中断然后跳过finally
?
答案 0 :(得分:11)
由于您特别询问守护程序线程:记住守护程序线程在jvm的最后一个非守护程序线程终止时消失,因此在这种情况下,守护程序线程可能会死而不执行finally块(或者其他任何代码)要执行,对于finally块没什么特别的。不要使用守护程序线程来处理你不介意在jvm终止时掉在地板上的任何东西。
否则,中断没有做任何事情来快捷方块块。中断点是被中断的线程处于控制状态并且可以完成其执行,包括关闭资源,但是它需要。
教程非常有用,但它们不具有权威性。在这种情况下的措辞使用单词 interrupted ,在这种情况下,假设它特指线程中断,这是不合理的,这是不正确的。