我有一个产生一堆线程的类,必须等到所有生成的线程都完成。 (我需要计算所有线程完成的时间)。
MainClass生成所有线程,然后检查是否所有线程都已完成,然后才能调用自己完成。
这种逻辑会起作用吗?如果是这样,有更好的方法吗?如果没有,我想更好地了解这种情况。
class MainClass{
private boolean isCompleted;
...
for(task : tasks){
threadpool.execute(task);
}
for(task : tasks){
if(!task.isCompleted()){
task.wait()
}
}
isCompleted = true;
}
class Task{
public void run(){
....
....
synchronized(this){
task.completed = true;
notifyAll();
}
}
}
答案 0 :(得分:11)
notifyAll()
相对较慢。更好的方法是使用CountDownLatch
:
import java.util.concurrent.CountDownLatch;
int n = 10;
CountDownLatch doneSignal = new CountDownLatch(n);
// ... start threads ...
doneSignal.await();
// and within each thread:
doWork();
doneSignal.countDown();
答案 1 :(得分:4)
在这种情况下不需要等待/通知。您可以循环遍历线程并调用join()
。如果线程已经完成,MainClass线程将等待下一个线程。
您可能也希望查看java.util.concurrent
包中的更高级别的实用程序。
答案 2 :(得分:4)
所有这些都可以通过java.util.concurrent.ExecutorService完成。
class MainClass {
...
ExecutorService executor = Executors.newCachedThreadPool();
List<Callable> tasks = ...; // prepare your tasks
// this invokes all tasks in parallel and waits until all are done
executor.invokeAll(tasks);
...
}
就是这样。