为了账号安全,请及时绑定邮箱和手机立即绑定

如何等待多个线程完成?

如何等待多个线程完成?

阿波罗的战车 2019-08-26 17:30:34
如何等待多个线程完成?简单地等待所有线程进程完成的方法是什么?例如,假设我有:public class DoSomethingInAThread implements Runnable{     public static void main(String[] args) {         for (int n=0; n<1000; n++) {             Thread t = new Thread(new DoSomethingInAThread());             t.start();         }         // wait for all threads' run() methods to complete before continuing     }     public void run() {         // do something here     }}我如何改变这一点,以便main()方法在注释处暂停,直到所有线程的run()方法都退出?谢谢!
查看完整描述

3 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

您将所有线程放在一个数组中,启动它们,然后循环

for(i = 0; i < threads.length; i++)
  threads[i].join();

每个连接将阻塞,直到相应的线程完成。线程可以以与加入它们不同的顺序完成,但这不是问题:当循环退出时,所有线程都完成。


查看完整回答
反对 回复 2019-08-26
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

一种方法是做一个List的ThreadS,创建和启动每个线程,而将其添加到列表中。一旦启动所有内容,循环回列表并调用join()每个列表。线程完成执行的顺序并不重要,您需要知道的是,当第二个循环完成执行时,每个线程都将完成。


更好的方法是使用ExecutorService及其相关方法:


List<Callable> callables = ... // assemble list of Callables here

                               // Like Runnable but can return a value

ExecutorService execSvc = Executors.newCachedThreadPool();

List<Future<?>> results = execSvc.invokeAll(callables);

// Note: You may not care about the return values, in which case don't

//       bother saving them

使用ExecutorService(以及来自Java 5的并发实用程序的所有新东西)非常灵活,上面的示例几乎没有表面上的划痕。


查看完整回答
反对 回复 2019-08-26
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;


public class DoSomethingInAThread implements Runnable

{

   public static void main(String[] args) throws ExecutionException, InterruptedException

   {

      //limit the number of actual threads

      int poolSize = 10;

      ExecutorService service = Executors.newFixedThreadPool(poolSize);

      List<Future<Runnable>> futures = new ArrayList<Future<Runnable>>();


      for (int n = 0; n < 1000; n++)

      {

         Future f = service.submit(new DoSomethingInAThread());

         futures.add(f);

      }


      // wait for all tasks to complete before continuing

      for (Future<Runnable> f : futures)

      {

         f.get();

      }


      //shut down the executor service so that this thread can exit

      service.shutdownNow();

   }


   public void run()

   {

      // do something here

   }

}


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 468 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信