如何等待几个对象

时间:2011-03-28 14:01:43

标签: java multithreading synchronization

我有一个必须等​​待来自不同线程的多个对象的线程。

@Override
public void run() {
    while (true) {
        for (BackgroundTask task : tasks) {
            synchronized (task) {
                if (task.isReady()) {
                    task.doTask();
                }
            }
        }
    }
}

但这是对CPU时间的愚蠢使用。 如何等待几个物体?

4 个答案:

答案 0 :(得分:3)

IMO CountDownLatch将是一个很好的方式来实现它。引自Javadoc:

 class Driver2 { // ...
   void main() throws InterruptedException {
     CountDownLatch doneSignal = new CountDownLatch(N);
     Executor e = ...

     for (int i = 0; i < N; ++i) // create and start threads
       e.execute(new WorkerRunnable(doneSignal, i));

     doneSignal.await();           // wait for all to finish
   }
 }

 class WorkerRunnable implements Runnable {
   private final CountDownLatch doneSignal;
   private final int i;
   WorkerRunnable(CountDownLatch doneSignal, int i) {
      this.doneSignal = doneSignal;
      this.i = i;
   }
   public void run() {
      try {
        doWork(i);
        doneSignal.countDown();
      } catch (InterruptedException ex) {} // return;
   }

   void doWork() { ... }
 }

答案 1 :(得分:1)

如果您可以修改BackgroundTask课程,请在准备好后通知您的跑步者。向您的运行程序类添加一个队列,每次任务准备就绪时,它都可以将自己添加到队列并通知它。

当队列为空时,它会在队列上等待,并在不存在时将项目拉出来运行。

答案 2 :(得分:1)

请使用notifyaAll()而不是notify(),因为notify会唤醒单个线程,而notifyAll()会唤醒所有等待的线程。

答案 3 :(得分:0)

您可以在Object上使用notify()wait()。你如何使用它取决于程序的结构。