java - 如何等待多个对象

标签 java multithreading synchronization

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

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

但这是对 CPU 时间的愚蠢使用。 如何等待多个对象?

最佳答案

海事组织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() { ... }
 }

关于java - 如何等待多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5460103/

相关文章:

java - 在 java/android 中过滤 arraylist

未找到 C11 GCC threads.h?

c# - 获取本地保管箱同步状态

c - 如何同步线程?

java - Hibernate 中的外键共享

java - 无法解析的日期,以冒号分隔时区

c# - 取消处于阻塞状态的任务的最佳方法是什么?

ios - Swift 从 api 可能的线程问题中获取值(value)

c# - 为什么我的列表在函数调用中分配后为空?

JavaFX ListView 键盘导航