关闭窗口上的Java关闭钩子调用

时间:2015-03-21 05:45:16

标签: java windows native shutdown-hook

我有一种情况,当用户向操作系统发出信号(在我的情况下只有Windows)关机时,我想执行某项任务。

我尝试过使用java shutdown hooks。我遇到的问题是,当我使用System.exit(0);退出程序时,会调用关闭挂钩,但是当我直接关闭计算机时,它们不会。

这是我用于关闭钩子的代码 -

Runtime.getRuntime().addShutdownHook(new JVMShutdownHook()); //in main method

//within the main java class
private static class JVMShutdownHook extends Thread {
@Override
public void run() {
   //perform tasks
}
}

有没有办法与操作系统进行交互(我假设有一些本机代码),以便它可以让我的程序优雅地退出?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

ShutdownHooks确实无法通过关闭Windows来工作。我认为它是Java的一个bug,上周开了一个BugReport。然而,它尚未发表。

2008年有一个旧的Bug报告:Runtime#addShutdownHook does not work on Windows Vista, when user logs out。 Windows 7也出现了同样的问题.7.0版没有令人满意的响应而关闭了故障单。

Windows通过关闭一段时间让应用程序正常终止。延迟由注册表项WaitToKillApplication定义。我希望java程序使用这个延迟来执行钩子(如果设置了Runtime.runFinalizersOnExit()则终止。)

让我们看看Oracle是否认为它是一个错误......

答案 1 :(得分:0)

您必须编写本机方法。两个用于添加和删除关闭钩子,另一个用作钩子的回调方法,从中调用java代码。 钩子必须侦听操作系统关闭消息并在发生此事件时调用您的回调。这是阻止Windows进入睡眠模式或运行屏幕保护程序的大量应用程序的工作方式。

在这里查看有关JNI的一些信息

http://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.html

和关于这里的钩子

https://msdn.microsoft.com/en-us/library/windows/desktop/ms644960%28v=vs.85%29.aspx