当关机挂钩坏了

时间:2011-11-17 17:33:06

标签: java runtime shutdown

如果我将 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的关闭钩子,为什么?

5 个答案:

答案 0 :(得分:6)

  • 如果进程被终止,则不会执行关闭挂钩。

  • 如果进程崩溃,则不会执行关闭挂钩。

  • 如果您有Windows服务且关闭挂钩需要很长时间才能执行,它将被终止。

答案 1 :(得分:3)

如果从计算机背面拔出插头,则关闭挂钩将无法运行。其他情况包括:

  • 使用SIGKILL(-9)在POSIX OS上终止进程。
  • 同样,如果您选择在Windows下终止“无响应”进程,则关闭挂钩可能无法完成。

答案 2 :(得分:0)

只有当流程“正常关闭”时,它们才会运行。如果该进程被强制从操作系统中杀死,或者由于资源问题(例如,内存不足)而导致进程崩溃,则不会调用关闭挂钩。

答案 3 :(得分:0)

当您执行Runtime.getRuntime().halt() JVM或操作系统终止进程而不允许它运行任何清理时,也就是当你让eclipse终止程序时(在eclipse下运行它时)

答案 4 :(得分:0)

只要JVM正常退出,就会运行关闭挂钩。如果出现以下情况,则不会运行:

  • JVM崩溃了。 (根据崩溃的方式/时间,钩子可能仍在运行,但不保证)
  • JVM获取SIGKILL或类似内容,并立即被操作系统
  • 停止