Multithreading 确保所有线程在JVM完全终止之前完成
假设我有一个SwingWorker对象,它仍然在doInBackground()方法中。如果用户调用system.exit(0)…如何最好地确保SwingWorker守护进程/工作线程完成?我想我必须手动完成这项工作。目前我的最佳想法是在调用System.exit(0)的同一线程中/上的所有未完成工作线程上调用join()。这是否正确 而且,如果使用join()是个好主意……我应该在调用join()的线程具有虚假活动的情况下,在某种while循环中使用它吗 例如: //伪码Multithreading 确保所有线程在JVM完全终止之前完成,multithreading,join,jvm,swingworker,Multithreading,Join,Jvm,Swingworker,假设我有一个SwingWorker对象,它仍然在doInBackground()方法中。如果用户调用system.exit(0)…如何最好地确保SwingWorker守护进程/工作线程完成?我想我必须手动完成这项工作。目前我的最佳想法是在调用System.exit(0)的同一线程中/上的所有未完成工作线程上调用join()。这是否正确 而且,如果使用join()是个好主意……我应该在调用join()的线程具有虚假活动的情况下,在某种while循环中使用它吗 例如: //伪码 Vector<
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();
Vector线程必须在终止JVM=new Vector()之前完成;
线程关闭线程=新线程(){
公开募捐{
for(线程t:ThreadsThat必须在终止JVM之前完成){
//closingThread等待t完成,(这真的安全吗?)
t、 join();
}
系统出口(0);
}
}
closingThread.start();
这完全正确吗?看一看
“System.exit方法强制终止Java虚拟机中的所有线程。”
如果你调用system.exit,你基本上是说,“现在退出,我不管发生了什么。”如果你想完全关闭,你需要在你的线程之间设置某种协调/同步
如果您的doInBackground方法仍然处于活动状态,您可以等到它完成后再退出,使用一些同步原语、共享锁或类似的方法
您可以在SwingWorker的方法中添加一些允许退出的逻辑
更好的方法可能是询问你的SwingWorker。如果任务已经完成,它将返回DONE,如果是这样,您可以退出,否则请等待。阅读本文,了解当所有非守护进程线程完成时,JVM将退出
return
frommain
将完成主线程。谢谢。但是你能告诉我怎么回答我的问题吗?谢谢你提供的信息。但我的问题是,考虑到这些信息,在退出之前等待所有后台线程完成的最佳方式是什么。