[英]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+C
或SIGINT
进行正常关机?
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.