如何等待多个线程完成?

有什么方法可以简单地等待所有线程进程完成?例如,假设我有:

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()


答案 1

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

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

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


答案 2

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

更好的方法是使用 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 的并发实用程序中的所有新内容)非常灵活,上面的示例甚至几乎没有触及表面。