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

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

输出

two 正在等待。
three 正在等待。
one 正在等待。
one 已完成。
two 已完成。
three 已完成。

1个回答

9

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

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

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

latch.await();

注意:当然还有很多其他用例,它们不一定需要是线程,但通常以异步方式运行,同一任务可以多次减少相同的门闩等。上面只描述了 CountDownLatch 的一个常见用例。

感谢Zbynek的快速回复。这是否意味着来自同一线程的多个倒计时将被视为一个? - NewToJava
@hungry:不,每个倒计时都有作用,无论是来自同一个线程还是不同的线程。它实际上对线程一无所知。 - Zbynek Vyskovsky - kvr000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接