最终没有调用Java程序模拟

时间:2013-09-26 18:23:57

标签: java

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


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


但是,在我写的所有案例中,最后都被调用(thread.suspend()除了thread.resume()System.exit()个案例之外。甚至最后在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");
}

2 个答案:

答案 0 :(得分:1)

来自Thread.stop的javadoc:

  

此线程表示的线程被强制停止它是什么   做异常并将新创建的ThreadDeath对象抛出   异常。

因此,此方法实际上会抛出Exception,因此仍会调用finally

答案 1 :(得分:0)

补充@Boris

来自javadoc:

  

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