假设我有一个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();
这一切都正确吗?
答案 0 :(得分:2)
看看here
“System.exit方法强制终止Java虚拟机中的所有线程。”
如果你打电话给system.exit,你基本上会说,“现在退出,我不在乎发生了什么。”如果你想干净地关闭,你需要在你的线程之间设置一些协调/同步。
如果你的doInBackground方法仍处于活动状态,你可以等到它完成后再退出,某些同步原语,共享锁或其他一些方法。
您可以在SwingWorker的done()方法中添加一些允许退出的逻辑。
更好的方法可能是在SwingWorker上查询getState()。如果任务已经完成,它将返回DONE,如果是,你可以退出,否则只需等待。