Java关闭钩子

时间:2013-10-28 15:50:57

标签: java hook shutdown

我已将以下代码添加到我的程序中:

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("exit");
    }
}){});
但是,我没有看到这条消息。附加信息:我在Java 7上从Netbeans IDE内部运行程序。

编辑:我忘了添加一个全局线程来保持程序活着。我按下Netbeans右下角的[x]来关闭它。

2 个答案:

答案 0 :(得分:13)

JVM可以以有序或突然的方式关闭。关闭挂钩运行以便有序关闭:当最后一个normal线程终止时,有人调用System.exit或通过其他特定于平台的方式(例如键入Ctrl-C)。

关闭挂钩不会因JVM的突然关闭而运行。当您按下Netbeans右下角的[x]时,这将导致JVM突然关闭,这就是没有启动关闭挂钩的原因。

例如:

public class ShutdownHook {
public void attachShutDownHook() {
    Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run() {
            System.out.println("exit");
        }
    });

}

public static void main(String[] args) {
    ShutdownHook sample = new ShutdownHook();
    sample.attachShutDownHook();
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

如果您运行上面的代码,并让程序正常完成,您将在控制台上看到exit。但是如果你按[x](在3秒内)突然关闭它,关机挂钩将不会运行,并且控制台上不会打印任何exit

答案 1 :(得分:2)

  

我忘了添加一个全局线程来保存程序   活。我按下Netbeans右下角的[x]来关闭它。

嗯,就是这样,在netbeans右下角关闭程序“x”不是经常关闭,它只是打破了一切并关闭它。

ShutdownHook仅在程序定期退出时才有效...