11

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

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

但是,我没有看到该消息。附加信息:我正在 Java 7 上的 Netbeans IDE 内部运行该程序。

编辑:我忘了补充说有一个全局线程可以让程序保持活力。我按 Netbeans 右下角的 [x] 将其关闭。

4

2 回答 2

15

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打印在控制台上。exit但是如果你按 [x](3 秒内)突然关闭它,shutdown hook 将不会运行,控制台上也不会打印任何内容。

于 2013-10-28T16:26:47.817 回答
2

我忘了补充一点,有一个全局线程可以让程序保持活力。我按 Netbeans 右下角的 [x] 将其关闭。

就是这样,在netbeans右下角用“x”关闭程序不是正常关闭,它只是破坏一切并关闭它。

ShutdownHook 仅在程序正常退出时才起作用...

于 2013-10-28T15:55:54.103 回答