如果我将 shutdown hook 添加到我的Java程序的运行时,如下所示:
public class MyShutdownHook implements Runnable
{
@Override
public void run()
{
// Stuff I want executed anytime
// the program, Java, or the OS exits normally,
// crashes, or terminates unexpectedly for any reason.
}
}
// The in another method...
Runtime.getRuntime().addShutdownHook(new MyShutdownHook());
...那么曾经当程序/ Java / OS正常退出,崩溃或意外终止时,run()
方法不会执行的任何情况?如果是这样,什么情况可以绕过Runtime
的关闭钩子,为什么?
答案 0 :(得分:6)
如果进程被终止,则不会执行关闭挂钩。
如果进程崩溃,则不会执行关闭挂钩。
如果您有Windows服务且关闭挂钩需要很长时间才能执行,它将被终止。
答案 1 :(得分:3)
如果从计算机背面拔出插头,则关闭挂钩将无法运行。其他情况包括:
答案 2 :(得分:0)
只有当流程“正常关闭”时,它们才会运行。如果该进程被强制从操作系统中杀死,或者由于资源问题(例如,内存不足)而导致进程崩溃,则不会调用关闭挂钩。
答案 3 :(得分:0)
当您执行Runtime.getRuntime().halt()
JVM或操作系统终止进程而不允许它运行任何清理时,也就是当你让eclipse终止程序时(在eclipse下运行它时)
答案 4 :(得分:0)
只要JVM正常退出,就会运行关闭挂钩。如果出现以下情况,则不会运行: