当我在后台运行Java进程并关闭计算机(ArchLinux)时,计算机是否会等待几秒钟以终止Java中的shutdown-hook?
答案 0 :(得分: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
}
}));
如果花费太多时间,系统将从不等待完全终止
当虚拟机因用户注销或系统关闭而终止时,底层操作系统可能只允许一段固定的时间来关闭和退出。因此,不建议尝试任何用户交互或在关闭钩子中执行长时间运行的计算。
答案 1 :(得分:1)
您可以将java程序包装为服务,它将启动并关闭操作系统。最简单的方法之一是使用spring boot framework。
答案 2 :(得分:1)
当关闭JVM的调用被调用时,将调用关闭钩子。但是,无法保证将调用挂钩。钩子可能不会/不会运行:
Runtime.halt()
也会阻止钩子开始运行。当用户关闭计算机时(不是通过拉动插头),计算机会向JVM发送一个关闭命令,该命令将执行关机挂钩,但如果拔掉电源,计算机将没有时间做任何事情,更不用说向JVM发出命令了。
我记得在某处读过(但我再也找不到链接) - 它说一个关闭钩子不应该花费太多时间来执行,或者当系统想要关闭时windows可能会杀死它。这表示如果您决定通过操作系统关闭系统,将运行关闭挂钩。
Tl; dr:这取决于直接拉动电源,或者如果操作系统崩溃,它们将无法运行。正常的操作系统关闭将运行挂钩,但操作系统可能会在完成之前关闭它们,如果它们花费的时间太长。
这是来自javadoc。
当虚拟机因用户注销或系统关闭而终止时,底层操作系统可能只允许一段固定的时间来关闭和退出。因此,不建议尝试任何用户交互或在关闭钩子中执行长时间运行的计算。
这表明操作系统想要关闭时会运行挂钩,但是建议它们不会花很长时间或者它们可能会被杀死。