Java关闭钩子

12

我已经将下面的代码添加到了我的程序中:

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

然而我没有看到这个消息。其他信息:我正在使用Java 7在Netbeans IDE内部运行程序。

编辑:我忘记添加一个全局的线程来保持程序运行。我通过在Netbeans右下角按下[x]按钮来关闭它。


尝试向Java进程发送“SIGHUP”(kill -1 <pid>),而不是点击UI按钮。http://en.wikipedia.org/wiki/Unix_signal#POSIX_signals - Matt Ball
当我将你的示例代码粘贴到一个 main 方法中时,它可以正常工作。 - pburka
4
注意,{} 是不必要的。它实际上创建了 Thread 的一个匿名内部子类。 - pburka
Runnable并不是必需的。相反,您可以重写Thread的run方法,它将具有相同的功能。 - H2ONaCl
2个回答

18

JVM可以以有序或突然的方式关闭。有序关闭时运行关闭挂钩(shutdown hook):当最后一个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。但是如果您在3秒内按[x]以突然关闭它,则关闭挂钩不会运行,并且控制台上不会打印任何exit


好的,那我明白了。当前的代码(带有有意义的关闭挂钩)仍然值得保留。但是是否有一种方法可以在Netbeans关闭时进行适当的关闭?另外,有什么好的方式可以正常关闭程序?由于控制台正在不断输出,因此我无法访问System.In。 - skiwi
在代码中使用 System.exit(0); 可以关闭你的程序。 - Debojit Saikia
该程序必须在特定文件夹添加文件时做出反应,因此需要一直运行。但是,在维护情况下仍需要一些适当的关闭方式。 - skiwi
1
当您在控制台上键入crtl+c时,关闭挂钩将运行。如果有UI,则可以使用System.exit(0); - Debojit Saikia

2

我忘记说了,有一个全局线程让程序保持活动状态。我通过在Netbeans右下角按下[x]来关闭它。

好的,通过在Netbeans右下角的“x”关闭程序并不是正常关闭,它会破坏一切并关闭程序。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接