Linux关机和Java Shutdown Hook

3
当我在后台运行Java进程并关闭计算机(ArchLinux),计算机会等待一些时间来终止我在Java中的shutdown-hook吗?
3个回答

2

如果你想在系统关闭时做一些操作,你需要添加一个 shutdown-hook(假设你已经这样做了):

Runtime.getRuntime().addShutdownHook(
new Thread(new Runnable() {
    @Override
    public void run() {
        // This method will be executed and Virtual Machine will close when this method will return
    }
}));

系统永远不会等待完全终止,如果它的时间太长。在文档中,当虚拟机由于用户注销或系统关闭而终止时,底层操作系统可能仅允许一定的时间来关闭和退出。因此,在关闭挂钩中尝试任何用户交互或执行长时间运算是不明智的。 (摘自Runtime#addShutdownHook

他在询问钩子是否会在关闭时运行,而不是如何实现它。 - Luke Melaia
我还增加了一些精度 - Xephi

1
你可以将Java程序包装成服务,使其随着操作系统启动和关闭。其中最简单的方法之一是使用spring boot framework

1
当调用关闭JVM时,将调用关闭挂钩。但是,无法保证挂钩将被调用。以下情况下可能不会运行挂钩:
  • 如果JVM由于内部错误而崩溃。
  • 如果发送SIGKILL或在Linux中发送kill -9以及在Windows中发送TerminateProcess。
  • Runtime.halt()也将防止运行挂钩。
  • 计算机电源被拔掉(插头)。
  • 您的操作系统崩溃。

当用户关闭计算机(非拔插)时,计算机向JVM发送关闭命令,将执行关闭挂钩,尽管如果拔掉电源,计算机将没有任何时间做任何事情,更不用说发出命令给JVM了。

我记得在某个地方读到过(但我找不到链接了)-它说关闭挂钩不应该花费太多时间来执行,否则Windows可能会在系统想要关闭时杀死它。这表明如果您决定通过操作系统关闭系统,则将运行关闭挂钩。

总之,这取决于直接断电或操作系统崩溃的情况下,它们将不会运行。正常的操作系统关闭将运行钩子,尽管如果它们花费的时间太长,操作系统可能会在它们完成之前关闭它们。

这段内容来自javadoc。

当虚拟机因用户注销或系统关机而终止时,底层操作系统可能只允许一定的时间来关闭和退出。因此,在关机钩子中不建议尝试进行任何用户交互或执行长时间运行的计算。

这表明当操作系统想要关闭时将运行钩子,但建议不要花费太长时间,否则它们可能会被强制终止。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接