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

时间:2011-05-17 10:34:59

标签: java terminal termination

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

有没有办法在我的Java应用程序中捕获此“请求”,以便我可以正常关闭它并释放所有资源/写入日志。如果它对响应产生影响,我会运行几个不同的线程。

我知道你有一个addShutDownHook,但是在Java文档中写的,在某些情况下不会调用它,比如linux中“CTRL + C”的kill信号......还有其他方法吗? / p>

Runtime.getRuntime().addShutdownHook(new Thread()
{
    public void run ()
    {
        // TODO: implement graceful shutdown here.
    }
});

2 个答案:

答案 0 :(得分:3)

我认为免责声明仅适用于kill -9,因此您不必依赖调用的关闭挂钩来维护数据的一致性。

因此,如果允许进程通过操作系统对该信号进行操作,则会调用关闭挂钩,如果您知道操作系统的工作方式,那么这一点非常明显,但对于所有Java开发人员而言可能并非如此。

实际上在javadoc中详细解释了这一点。

另外值得注意的是,在VM中可以注册多个关闭挂钩,因此您的关闭挂钩可能不是几个中的一个。

答案 1 :(得分:2)

这适用于我,在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);
        }
    }
}