11

例如,我让我的应用程序在 Linux 终端中运行,然后按键盘上的“CTRL+C”来终止将终止 Java 程序的进程。

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

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

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

2 回答 2

3

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

因此,如果操作系统允许进程对信号进行操作,则会调用关闭钩子,如果您知道操作系统的工作原理,这非常明显,但可能并非所有 Java 开发人员都知道。

它实际上在javadoc中有非常详细的解释。

另外值得记住的是,在一个虚拟机中可以注册多个关闭挂钩,所以你的可能不是关闭挂钩,只是几个之一。

于 2011-05-17T10:38:56.767 回答
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);
        }
    }
}
于 2011-05-17T10:41:14.007 回答