中断的Java线程是否真的可以跳过finally子句?

时间:2017-06-05 19:12:15

标签: java multithreading finally

当我从the Oracle Java tutorial读到这篇文章时,我正在检查JVM中的守护程序线程是否以某种特殊方式处理finally块(它们没有,好吗?)。

  

注意:如果在执行trycatch代码时JVM退出,则finally块可能无法执行。同样,如果执行trycatch代码的线程中断或被杀死,则 finally块可能无法执行,即使整个申请仍在继续。

(重点是我的。)关于打断的一点引起了我的注意!

我的信念是,如果一个线程在try / catch代码中并且被中断,那么我们要么(或最终进入)状态(例如睡眠,等待),我们最终会抛出InterruptedException ,或者我们不是,我们正常或异常退出,但在所有情况下,我们点击finally条款。

我错过了什么?在应用程序继续运行时,是否真的有一种方法可以让线程被中断然后跳过finally

1 个答案:

答案 0 :(得分:11)

由于您特别询问守护程序线程:记住守护程序线程在jvm的最后一个非守护程序线程终止时消失,因此在这种情况下,守护程序线程可能会死而不执行finally块(或者其他任何代码)要执行,对于finally块没什么特别的。不要使用守护程序线程来处理你不介意在jvm终止时掉在地板上的任何东西。

否则,中断没有做任何事情来快捷方块块。中断点是被中断的线程处于控制状态并且可以完成其执行,包括关闭资源,但是它需要。

教程非常有用,但它们不具有权威性。在这种情况下的措辞使用单词 interrupted ,在这种情况下,假设它特指线程中断,这是不合理的,这是不正确的。