繁体   English   中英

java关闭钩子有多个线程

[英]java shutdown hook with more than one thread

我试图在我的ubuntu服务器上使用关闭钩子,但是似乎有多个线程存在问题。 使用基本的ShutdownHook,当我使用kill <PID>杀死进程时,以下代码确实起作用,这意味着激活了关机行为。

public static void main(String[] args) {
    ShutdownHook shutDown = new ShutdownHook();
    shutDown.attachShutDownHook();

    while(true){}
}

但是,带有附加线程的同一代码不会

public static void main(String[] args) {
    ShutdownHook shutDown = new ShutdownHook();
    shutDown.attachShutDownHook();

    (new Thread() {
        public void run() {
            while ( true ) {}
        }
    }).start();

    while(true){}
}

有任何想法吗?

class ShutdownHook {

    ShutdownHook() {
    }

    public void attachShutDownHook() {

            Runtime.getRuntime().addShutdownHook(new Thread() {
                    @Override
                    public void run() {
                            System.out.println("Shut down hook activating");
                    }
            });
            System.out.println("Shut Down Hook Attached.");

    }
}

当仍有非守护进程线程在运行时,JVM将不会退出。 尝试在新线程上调用setDaemon(true)

以我自己的项目为例;

我的核心类产生了一大堆工作线程,这些工作线程运行必须完成的事务。

在核心课程中,我有;

Runtime.getRuntime().addShutdownHook(new ShutdownCleanup());

看起来像;

public final class ShutdownCleanup extends Thread() {
    public void run() {
        log("waiting for worker threads to finish...");
        while(WorkerThread.transactionInProgress()) {
            Thread.sleep(1000);
        }
        //close various sockets and resources
    }
}

当我在终端中Ctrl+C时,将显示log消息。 因此,关闭挂钩会立即激活,一旦程序准备终止,它就不会运行,而是在收到关闭或终止请求后立即运行。

出于这个原因,我认为其他人关于关闭钩子的说法是错误的,而当仍然有一个线程处于活动状态时,该钩子永远不会被调用。 关闭挂钩仅在一旦一切都消失后才激活,这又有什么意义呢?

可能是您正在强行杀死,例如-9。 您是否尝试使用Ctrl+CSIGINT进行正常关机?

java.lang.Runtime.addShutdownHook( Thread )注册了一个新的虚拟机关闭钩子:

Java虚拟机将响应以下两种事件而关闭:

  • 当最后一个非守护线程退出时,或者调用exit(等效于System.exit)方法时,程序将正常退出,或者

  • 响应于用户中断(例如键入^ C)或系统范围的事件(例如用户注销或系统关闭)来终止虚拟机。

您的代码会无限期运行,因此将永远不会调用shutdown挂钩。

[编辑后]

您使用哪个kill

杀死-9是不可捕获的

kill -2可用于模拟ctrl-c(SIGINT)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM