如何在Java中实现优雅的终止?
比如说,我让我的应用程序在Linux终端上运行,我按下键盘上的“CTRL+C”来终止它将终止Java程序的进程 有没有办法在我的Java应用程序中捕获这个“请求”,这样我就可以优雅地关闭它并释放所有资源/写日志。如果对响应有影响,我会运行几个不同的线程 我知道您有一个addShutDownHook,但是正如Java文档中所写的,在某些情况下不会调用它,比如linux中来自“CTRL+C”的kill信号……还有其他方法吗如何在Java中实现优雅的终止?,java,terminal,termination,Java,Terminal,Termination,比如说,我让我的应用程序在Linux终端上运行,我按下键盘上的“CTRL+C”来终止它将终止Java程序的进程 有没有办法在我的Java应用程序中捕获这个“请求”,这样我就可以优雅地关闭它并释放所有资源/写日志。如果对响应有影响,我会运行几个不同的线程 我知道您有一个addShutDownHook,但是正如Java文档中所写的,在某些情况下不会调用它,比如linux中来自“CTRL+C”的kill信号……还有其他方法吗 Runtime.getRuntime().addShutdownHook(n
Runtime.getRuntime().addShutdownHook(new Thread()
{
public void run ()
{
// TODO: implement graceful shutdown here.
}
});
我认为免责声明只适用于
kill-9
,这样您就不会依赖调用的关闭挂钩来维护数据的一致性
因此,如果允许进程根据操作系统发出的信号进行操作,就会调用关闭钩子,如果您知道操作系统是如何工作的,这一点很明显,但并非所有Java开发人员都知道
事实上,这一点在本文中有非常详细的解释
另外值得注意的是,一个VM中可以注册多个关机挂钩,因此您的可能不是关机挂钩,而是其中的一个。这对我来说很有效,在Linux上捕获SIGINT/Ctrl-C:
public class TestShutdownHook
{
public static void main(final String[] args) throws InterruptedException
{
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
System.out.println("Shutdown hook ran!");
}
});
while (true)
{
Thread.sleep(1000);
}
}
}
如果JVM停止,也不会调用关闭挂钩@Nathan D.Ryan True,我相信这是相当合理的。:)总而言之,它们不会在你无能为力的情况下被调用。