0

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

并且,如果使用 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();

这完全正确吗?

4

1 回答 1

2

看看这里

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

如果您调用 system.exit,您基本上是在说,“现在退出,我不在乎发生了什么。” 如果您想干净地关闭,您将需要在您的线程之间为我们设置某种协调/同步。

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

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

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

于 2013-07-11T21:39:01.487 回答