中断的 Java 线程真的可以跳过 finally 子句吗?
Can an interrupted Java thread really skip a finally clause?
当我读到这篇来自 the Oracle Java tutorial:
Note: If the JVM exits while the try
or catch
code is being executed, then the finally
block may not execute. Likewise, if the thread executing the try
or catch
code is interrupted or killed, the finally
block may not execute even though the application as a whole continues.
(重点是我的。)关于 中断 的一点引起了我的注意!
我的信念是,如果一个线程在 try/catch 代码中并被中断,那么我们要么处于(或最终进入)一个状态(例如睡眠、等待),我们最终会抛出一个 InterruptedException
,或者我们不是,我们正常或异常退出,但在所有情况下,我们 将 命中 finally
子句。
我错过了什么?是否真的有一种方法可以中断线程然后跳过 finally
,同时应用程序继续运行?
既然你特别询问守护线程:记住守护线程在 jvm 的最后一个非守护线程终止时消失,所以在这种情况下,守护线程可以在没有执行 finally 块(或它即将执行的任何其他代码)的情况下死亡,finally 块没有什么特别之处)。不要将守护线程用于任何您不介意在 jvm 终止时掉落在地板上的东西。
否则,中断对 finally 块的快捷方式没有任何作用。中断点是被中断的线程处于控制之中并且可以完成其执行,包括关闭资源,但是它需要。
教程可能很有帮助,但并不权威。本例中的措辞使用 interrupted 一词,在这种情况下似乎可以合理地假设它专门指的是线程中断,这是不正确的。
当我读到这篇来自 the Oracle Java tutorial:
Note: If the JVM exits while the
try
orcatch
code is being executed, then thefinally
block may not execute. Likewise, if the thread executing thetry
orcatch
code is interrupted or killed, thefinally
block may not execute even though the application as a whole continues.
(重点是我的。)关于 中断 的一点引起了我的注意!
我的信念是,如果一个线程在 try/catch 代码中并被中断,那么我们要么处于(或最终进入)一个状态(例如睡眠、等待),我们最终会抛出一个 InterruptedException
,或者我们不是,我们正常或异常退出,但在所有情况下,我们 将 命中 finally
子句。
我错过了什么?是否真的有一种方法可以中断线程然后跳过 finally
,同时应用程序继续运行?
既然你特别询问守护线程:记住守护线程在 jvm 的最后一个非守护线程终止时消失,所以在这种情况下,守护线程可以在没有执行 finally 块(或它即将执行的任何其他代码)的情况下死亡,finally 块没有什么特别之处)。不要将守护线程用于任何您不介意在 jvm 终止时掉落在地板上的东西。
否则,中断对 finally 块的快捷方式没有任何作用。中断点是被中断的线程处于控制之中并且可以完成其执行,包括关闭资源,但是它需要。
教程可能很有帮助,但并不权威。本例中的措辞使用 interrupted 一词,在这种情况下似乎可以合理地假设它专门指的是线程中断,这是不正确的。