windows关闭时的Java关闭钩子调用

windows关闭时的Java关闭钩子调用,java,windows,native,shutdown-hook,Java,Windows,Native,Shutdown Hook,在这种情况下,当用户向操作系统(在我的情况下,只有Windows)发出关闭信号时,我想执行一些任务 我尝试过使用java关闭挂钩。我面临的问题是,当我使用System.exit(0)退出程序时,关闭挂钩被调用,但当我直接关闭计算机时,它们没有被调用 这是我用于关闭挂钩的代码- Runtime.getRuntime().addShutdownHook(new JVMShutdownHook()); //in main method //within the main java class pri

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

我尝试过使用java关闭挂钩。我面临的问题是,当我使用
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
}
}
有没有办法与操作系统进行交互(我假设使用一些本机代码),使我的程序能够正常退出


任何帮助都将不胜感激。

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

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

关于钩子呢


关闭钩子
关闭Windows确实不起作用。我认为它是java的一个bug,上周打开了一个Bug端口。然而,它还没有出版

2008年有一个旧的Bug报告:。Windows 7也会出现同样的问题。java.com关闭了这张罚单,但没有令人满意的回应

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


让我们看看Oracle是否将其视为一个bug…

看看JNAAPI之类的东西,他们可能有一个操作系统关闭钩子,到目前为止运气不好。JNAAPI中有一个方法
Native.setProtected(true)
,可以防止VM崩溃,但我无法让它工作。