closures窗口上的Javaclosures挂接调用

我有一个情况,我想执行一些任务,当用户发信号的OS(在我的情况下,只有Windows)关机。

我已经尝试使用Javaclosures挂钩。 我面对的问题是,当我退出程序使用System.exit(0); ,closures挂钩被称为,但是当我直接closures电脑,他们不是。

这是我用于closures挂钩的代码 –

 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 } } 

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

任何帮助将不胜感激。

Solutions Collecting From Web of "closures窗口上的Javaclosures挂接调用"

ShutdownHooks确实不能通过关闭Windows来工作。 我认为这是Java的一个bug,上周打开了一个BugReport。 但尚未发表。

在2008年有一个旧的错误报告: 当用户注销时,运行时#addShutdownHook在Windows Vista上不起作用 。 Windows 7也出现同样的问题。这个票据被java.com关闭,没有一个令人满意的回应。

Windows通过关闭给予应用程序一段时间才能正常终止。 延迟是由注册表项WaitToKillApplication定义的。 我期望Java程序使用这个延迟来执行钩子(如果设置了Runtime.runFinalizersOnExit() ,那么最终结束)。

让我们看看Oracle是否认识到它是一个bug

你将不得不编写本地方法。 两个用于添加和删除您的关闭钩子,一个将作为钩子的回调方法,从中将调用Java代码。 您的钩子将不得不听取操作系统关闭消息,并在发生这种情况时调用您的回调。 这是大量的应用程序,防止窗口进入睡眠模式或运行屏幕保护程序的作品。

在这里查看关于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