首先,您的应用程序是结束还是强制结束?如果您要强制结束它(通过停止按钮),此 Eclipse 错误报告包含有关为什么这可能不起作用的详细信息。
如果做不到这一点,您可能认为这是特定于Windows的行为。我使用的是 Mac,因此无法确认,抱歉。但是,我可以告诉您,以下测试程序确实按预期执行关闭钩子。
public class MyShutdownHook
{
public static void main( String[] args )
{
System.out.println( "Entering main." );
Runtime.getRuntime().addShutdownHook(
new Thread(
new Runnable() {
public void run() {
System.out.println( "Shutdown hook ran." );
}
}
)
);
System.out.println( "Exiting main." );
}
}
Javadocs for Runtime#addShutdownHook 确实提到,当 JVM 中止时,关闭钩子不会运行,不会正常退出,所以再次,你的假设可能是正确的。话虽如此,这里有一些事情可以尝试。再说一遍,很抱歉,我不能提前确认这些 - 这里没有Windows。(真福!
- 确保 JVM 不包含 -Xrs 选项。这对关机挂钩有副作用。
- 尝试使用 -server 或 -client 选项启动 JVM。根据我的经验,边缘情况行为可以通过选择 VM 模式来影响。(特别是在线程方面 - 至少在Mac上。
- 你是否在探查器或类似工具下启动应用?正在加载任何本机库?
- 您是否遇到一些致命错误并丢失了它?例如,OutOfMemoryError或类似?
- 尝试选中/取消选中 Eclipse 中应用程序的“运行配置”对话框中的“在后台启动”选项。
- 最后但并非最不重要的一点是:如果有机会,请手动调用System.exit()。:)