Java:多线程-Wait / notifyAll问题

时间:2011-06-09 17:21:43

标签: java multithreading thread-safety threadpool

我有一个产生一堆线程的类,必须等到所有生成的线程都完成。 (我需要计算所有线程完成的时间)。

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

3 个答案:

答案 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);
    ...
}

就是这样。