【发布时间】:2016-12-18 16:32:49
【问题描述】:
当我在后台运行 Java 进程并关闭计算机 (ArchLinux) 时,计算机会等待几秒钟以终止我在 Java 中的关机挂钩吗?
【问题讨论】:
标签: java linux signals shutdown
当我在后台运行 Java 进程并关闭计算机 (ArchLinux) 时,计算机会等待几秒钟以终止我在 Java 中的关机挂钩吗?
【问题讨论】:
标签: java linux signals shutdown
如果你想在系统关机时做点什么,你需要添加一个关机钩子(假设你已经这样做了):
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
}
}));
如果花费了太多时间
,系统将从不等待完全终止当虚拟机因用户注销或系统关闭而终止时,底层操作系统可能只允许在固定的时间内关闭和退出。因此,不建议尝试任何用户交互或在关闭挂钩中执行长时间运行的计算。
【讨论】:
当调用关闭 JVM 时将调用关闭钩子。但是,不能保证会调用该钩子。钩子可能不会/不会运行:
Runtime.halt() 还会阻止挂钩开始运行。当用户关闭计算机时(不是通过拔掉插头),计算机会向 JVM 发送关闭命令,JVM 将执行关闭挂钩,但如果拔掉电源,计算机将没有任何时间去做任何事情,更不用说向 JVM 发出命令了。
我记得在某个地方读到过(但我再也找不到链接了)——它说关闭挂钩不应该花费太多时间来执行,否则当系统想要关闭时,Windows 可能会杀死它。这表明如果您决定通过操作系统关闭系统,将运行关闭挂钩。
Tl;dr:这取决于直接拉电源还是操作系统崩溃,它们将无法运行。正常的操作系统关闭将运行这些钩子,但如果它们花费的时间太长,操作系统可能会在它们完成之前关闭它们。
这是来自 javadoc。
当虚拟机因用户注销或系统关闭而终止时,底层操作系统可能只允许在固定的时间内关闭和退出。因此,不建议尝试任何用户交互或在关闭挂钩中执行长时间运行的计算。
这表明挂钩将在操作系统想要关闭时运行,但建议它们不要花很长时间,否则它们可能会被杀死。
【讨论】:
您可以将您的 java 程序包装为服务,它将随操作系统启动和关闭。最简单的方法之一是使用spring boot framework。
【讨论】: