Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 确保所有线程在JVM完全终止之前完成_Multithreading_Join_Jvm_Swingworker - Fatal编程技术网

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

Multithreading 确保所有线程在JVM完全终止之前完成,multithreading,join,jvm,swingworker,Multithreading,Join,Jvm,Swingworker,假设我有一个SwingWorker对象,它仍然在doInBackground()方法中。如果用户调用system.exit(0)…如何最好地确保SwingWorker守护进程/工作线程完成?我想我必须手动完成这项工作。目前我的最佳想法是在调用System.exit(0)的同一线程中/上的所有未完成工作线程上调用join()。这是否正确 而且,如果使用join()是个好主意……我应该在调用join()的线程具有虚假活动的情况下,在某种while循环中使用它吗 例如: //伪码 Vector<

假设我有一个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();
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
from
main
将完成主线程。谢谢。但是你能告诉我怎么回答我的问题吗?谢谢你提供的信息。但我的问题是,考虑到这些信息,在退出之前等待所有后台线程完成的最佳方式是什么。