CountDownLatch中await()的目的是什么?

时间:2017-01-26 04:01:02

标签: multithreading concurrency java.util.concurrent countdownlatch cyclicbarrier

我有以下程序,我使用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.");
}

OUTPUT 两个是等待。 三是等待。 一个是等待。 一个是完成的。 二是完成。 三是完成。

1 个答案:

答案 0 :(得分:0)

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

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

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

latch.await();

注意:当然还有许多其他用例,它们不需要是线程,但是通常异步运行的任何东西,相同的锁存器可以通过相同的任务等多次递减。上面描述了一个常见的用途CountDownLatch的案例。