我正在尝试编写一个示例程序,以确定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");
}
答案 0 :(得分:1)
来自Thread.stop
的javadoc:
此线程表示的线程被强制停止它是什么 做异常并将新创建的ThreadDeath对象抛出 异常。
因此,此方法实际上会抛出Exception
,因此仍会调用finally
。
答案 1 :(得分:0)
补充@Boris
来自javadoc:
应用程序通常不应该尝试捕获ThreadDeath,除非它必须执行一些特殊的清理操作(请注意,抛出ThreadDeath导致try语句的finally子句在线程正式死亡之前执行)。如果catch子句捕获ThreadDeath对象,则重新抛出对象以使线程实际死亡是很重要的。