1

我试图编写一个示例程序来确定 JVM 不调用 finally() 的情况,如http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html中所述。


注意:如果在执行 try 或 catch 代码时 JVM 退出,则 finally 块可能不会执行。同样,如果执行 try 或 catch 代码的线程被中断杀死,即使应用程序作为一个整体继续运行,finally 块也可能不会执行。


但是,在我写的所有情况下,finally 都被调用(除了thread.suspend()没有thread.resume()System.exit()情况)。甚至 finally 被调用,thread.stop()而不是在其他各种论坛中提到的(下面的代码片段)。

有人可以帮忙吗?谢谢。

try {
    final Thread thread = Thread.currentThread();
    new Thread(new Runnable() {
        @Override
        @SuppressWarnings(value = "deprecation")
        public void run() {
            thread.stop();
            // thread.suspend();
        }
    }).start();
    while (true)
        Thread.sleep(1000);
} finally {
    System.out.print("finally called after stop");
}
4

2 回答 2

1

从 javadoc 为Thread.stop

这个线程所代表的线程被强制停止它正在做的任何异常,并抛出一个新创建的 ThreadDeath 对象作为异常。

所以这个方法实际上抛出了一个Exception,因此finally仍然被调用。

于 2013-09-26T18:30:03.810 回答
0

补充@Boris

来自 javadoc:

应用程序通常不应该尝试捕获 ThreadDeath,除非它必须执行一些特别的清理操作(请注意,抛出 ThreadDeath 会导致 try 语句的 finally 子句在线程正式死亡之前执行)。如果一个 catch 子句捕获了一个 ThreadDeath 对象,那么重新抛出该对象以使线程真正终止是很重要的。

于 2013-09-26T18:39:30.003 回答