java如何等待多个线程完成?
什么是一种简单地等待所有线程进程完成的方法?例如,假设我有:
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 楼答案
完全避免使用Thread类,而是使用java中提供的高级抽象。util。同时发生
ExecutorService类提供的method invokeAll似乎正是您想要的
# 2 楼答案
一种方法是制作
List
个Thread
线程,创建并启动每个线程,同时将其添加到列表中。一旦所有东西都启动了,循环浏览列表,并对每个列表调用join()
。不管线程以什么顺序完成执行,您需要知道的是,当第二个循环完成执行时,每个线程都将完成更好的方法是使用ExecutorService及其相关方法:
使用ExecutorService(以及Java5的concurrency utilities中的所有新东西)是非常灵活的,上面的例子几乎没有触及表面
# 3 楼答案
考虑使用^ {CD1>}。在javadocs中的示例
# 4 楼答案
将所有线程放在一个数组中,启动所有线程,然后创建一个循环
每个连接都将阻塞,直到相应的线程完成。线程的完成顺序可能与加入它们的顺序不同,但这不是问题:当循环退出时,所有线程都已完成
# 5 楼答案
可以使用CountDownLatch,而不是
join()
这是一个旧的API。我已经修改了你的代码如下,以满足你的要求解释:
CountDownLatch
已根据您的要求使用给定的计数1000进行初始化每个工作线程
DoSomethingInAThread
将递减CountDownLatch
,该值已在构造函数中传递主线程
CountDownLatchDemo
await()
直到计数变为零。一旦计数变为零,您将在输出中得到下线来自oracle文档页面的更多信息
有关其他选项,请参阅相关SE问题:
wait until all threads finish their work in java
# 6 楼答案