确保在JVM完全终止之前完成所有线程

时间:2013-07-11 21:32:53

标签: multithreading join jvm swingworker

假设我有一个SwingWorker对象,它仍然在doInBackground()方法中。如果用户调用system.exit(0)...我如何才能最好地确保SwingWorker守护程序/工作线程完成?我想我必须手动完成这个。我现在最好的想法是在调用System.exit(0)的同一个线程中的/上调用join(),这是正确的吗?

AND,如果使用join()是个好主意......在调用join()的线程有虚假活动的情况下,我应该在某种while循环中使用它吗?

例如:

//伪代码

Vector<Thread> threadsThatMustFinishBeforeTerminatingJVM = new Vector<Thread>();

Thread closingThread = new Thread(){


    public void run(){

       for(Thread t: threadsThatMustFinishBeforeTerminatingJVM){

           // closingThread waits for t to finish, (is this *really* safe?)
           t.join();

         }

      System.exit(0);

    }
}

closingThread.start();

这一切都正确吗?

1 个答案:

答案 0 :(得分:2)

看看here

“System.exit方法强制终止Java虚拟机中的所有线程。”

如果你打电话给system.exit,你基本上会说,“现在退出,我不在乎发生了什么。”如果你想干净地关闭,你需要在你的线程之间设置一些协调/同步。

如果你的doInBackground方法仍处于活动状态,你可以等到它完成后再退出,某些同步原语,共享锁或其他一些方法。

您可以在SwingWorker的done()方法中添加一些允许退出的逻辑。

更好的方法可能是在SwingWorker上查询getState()。如果任务已经完成,它将返回DONE,如果是,你可以退出,否则只需等待。