我有一种情况,当用户向操作系统发出信号(在我的情况下只有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
}
}
有没有办法与操作系统进行交互(我假设有一些本机代码),以便它可以让我的程序优雅地退出?
非常感谢任何帮助。
答案 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