我有以下程序,我在其中使用 java.util.concurrent.CountDownLatch 而没有使用 await() 方法它工作正常。
我是并发的新手,想知道 await() 的目的。在“CyclicBarrier”中,我可以理解为什么需要 await() 但为什么在“CountDownLatch”中?

程序,

CountDownLatchSimple 类

public static void main(String args[]) {
  CountDownLatch latch = new CountDownLatch(3);
  Thread one = new Thread(new Runner(latch),"one");
  Thread two = new Thread(new Runner(latch), "two");
  Thread three = new Thread(new Runner(latch), "three");

  // Starting all the threads
  one.start(); two.start(); three.start();

}

Runner 类实现了 Runnable
CountDownLatch latch;

public Runner(CountDownLatch latch) {
    this.latch = latch;
}

@Override
public void run() {
    System.out.println(Thread.currentThread().getName()+" is Waiting.");
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    latch.countDown();
    System.out.println(Thread.currentThread().getName()+" is Completed.");
}

输出
二是等待。
三是等待。
一个是等待。
一个是完成。
二是完成。
三是完成。

最佳答案

CountDownLatch 是同步原语,用于等待所有线程完成某些操作。

每个线程都应该通过调用 countDown() 方法来标记完成的工作。等待 Action 完成的人应该调用 await() 方法。这将无限期地等待,直到所有线程通过调用 countDown() 将工作标记为已处理。例如,主线程可以继续处理工作线程的结果。

因此,在您的示例中,在 await() 方法的末尾调用 main() 是有意义的:

latch.await();

注意:当然还有很多其他用例,它们不需要是线程,但是无论通常是异步运行的,同一个锁可以被同一个任务等递减几次。 以上仅描述了 CountDownLatch 的一个常见用例.

关于multithreading - CountDownLatch 中 await() 的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41866691/

10-12 01:30