【问题标题】:Java shutdown hookJava 关闭钩子
【发布时间】:2013-10-28 15:50:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 尝试向 Java 进程 (kill -1 <pid>) 发送 SIGHUP,而不是单击 UI 按钮。 en.wikipedia.org/wiki/Unix_signal#POSIX_signals
  • 当我将它粘贴到 main 方法中时,您的示例对我来说很好。
  • 请注意,{} 是不必要的。它实际上创建了Thread 的匿名内部子类。
  • Runnable 不是必需的。相反,您可以覆盖 Thread 的 run 方法,它在功能上是相同的。

标签: java hook shutdown


【解决方案1】:

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 秒内)突然关闭它,shutdown 钩子将不会运行,并且控制台上不会打印任何exit

【讨论】:

  • 好的,那我明白了。当前代码(带有有意义的关闭挂钩)仍然值得保留。但是还有一种方法可以在关闭 Netbeans 的情况下正确关闭吗?还有什么是正常关闭程序的好方法?我无法访问 System.In,因为控制台一直被用于输出。
  • 您可以在代码中使用System.exit(0); 来关闭您的程序。
  • 该程序是一个在将文件添加到特定文件夹时必须做出反应的程序,所以恐怕它需要永远运行。不过,在维护时仍然需要一些方法来正确关闭它。
  • 当你在控制台输入 crtl+c 时,shutdown hook 会运行。如果有用户界面,你可以使用System.exit(0);
【解决方案2】:

我忘了补充说有一个全局线程来保存程序 活。我按 Netbeans 右下角的 [x] 将其关闭。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多