小编典典

Java Shutdown挂钩未运行

java

我是Java /线程的新手,并且继承了类似以下代码的内容。这是一个命令行程序,main()仅启动5-6种不同类型的线程,并以^
C退出。我想添加一个关闭钩子以正确关闭所有线程,并通过以下方式对其进行调整。

我在所有线程中添加了一个Shutdown钩子和一个stopThread()方法(例如MyWorker类中的一个)

问题是当我按^ CI时,看不到线程的run方法的结束消息。这是在后台完成的还是我的方法有问题?另外,我应该遵循更好的模式吗?

谢谢

 public class Main {
     public static MyWorker worker1 = new MyWorker();
     // .. various other threads here

     public static void startThreads() {
         worker1.start();
         // .. start other threads
     }

     public static void stopThreads() {
         worker1.stopThread();
         // .. stop other threads
     }

     public static void main(String[] args)
             throws Exception {

         startThreads();

         // TODO this needs more work (later)

         Runtime.getRuntime().addShutdownHook(new Thread() {
             @Override
             public void run() {
                 try {
                     stopThreads();
                 } catch (Exception exp) {

                 }
             }
         });
     } }

 public class MyWorker extends Thread {
     private volatile boolean stop = false;

     public void stopThread() {
         stop = true;
     }

     public void run() {
         while (!stop) {
             // Do stuff here
         }
         // Print exit message with logger
     } 
}

阅读 218

收藏
2020-10-12

共1个答案

小编典典

当您调用System.exit()或通过信号终止时,它将停止所有现有线程并启动所有关闭挂钩。也就是说,您的所有线程都可能在您启动钩子之前就死掉了。

您应该确保干净地关闭资源,而不是试图干净地停止线程。

2020-10-12