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

标签 java terminal termination

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

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

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

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

最佳答案

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

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

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

另外值得记住的是,一个 VM 中可以注册多个关闭 Hook ,因此您的关闭 Hook 可能不是 THE shutdown hook,只是其中之一。

关于java - 如何在 Java 中实现优雅终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6029564/

相关文章:

java - Hibernate- @OnetoMany 在 Collection 上带有 Where 子句

java - 使用绝对路径从终端运行 jar 文件

python - 如何在 Python 中获取 Linux 控制台窗口的宽度

recursion - 结构感应的终止

android - 如何以编程方式强制停止我的 android 应用程序?

java - 如何安全地将线程生命周期绑定(bind)在一起,涉及 SQLite

java - 访问包含 JTable 的 JScrollpane

algorithm - 为什么人们说 Java 不能有表达式求值器?

java - 在 "coupled"JSliders 中避免不必要的事件和无限循环?

c - 哈佛 CS50 库,需要在 Mac OS X 上安装帮助