Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中实现优雅的终止?_Java_Terminal_Termination - Fatal编程技术网

如何在Java中实现优雅的终止?

如何在Java中实现优雅的终止?,java,terminal,termination,Java,Terminal,Termination,比如说,我让我的应用程序在Linux终端上运行,我按下键盘上的“CTRL+C”来终止它将终止Java程序的进程 有没有办法在我的Java应用程序中捕获这个“请求”,这样我就可以优雅地关闭它并释放所有资源/写日志。如果对响应有影响,我会运行几个不同的线程 我知道您有一个addShutDownHook,但是正如Java文档中所写的,在某些情况下不会调用它,比如linux中来自“CTRL+C”的kill信号……还有其他方法吗 Runtime.getRuntime().addShutdownHook(n

比如说,我让我的应用程序在Linux终端上运行,我按下键盘上的“CTRL+C”来终止它将终止Java程序的进程

有没有办法在我的Java应用程序中捕获这个“请求”,这样我就可以优雅地关闭它并释放所有资源/写日志。如果对响应有影响,我会运行几个不同的线程

我知道您有一个addShutDownHook,但是正如Java文档中所写的,在某些情况下不会调用它,比如linux中来自“CTRL+C”的kill信号……还有其他方法吗

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,我相信这是相当合理的。:)总而言之,它们不会在你无能为力的情况下被调用。