跳到主要内容

十一、Java并发 Java CountDownLatch

本章节我们来讨论下 java.util.concurrent.CountDownLatch 这个类,顺带演示下如何在一些实际例子中使用它。

CountDownLatch 类的作用呢? 怎么说呢? 简单来说,我们可以使用它来阻塞线程,直到其他线程完成给定任务。

并发编程中使用 CountDownLatch​

简而言之,CountDownLatch 有一个计数器字段,我们可以根据需要减少它,因此,我们可以使用它来阻止调用线程,直到它被计数到零。

如果我们正在进行一些并行处理,我们可以使用与计数器相同的值来实例化 CountDownLatch,因为我们想要处理多个线程。然后,我们可以在每个线程完成后调用 countdown(),保证调用 await() 的依赖线程将阻塞,直到工作线程完成。

使用 CountDownLatch 等待线程池完成​

我们通过创建一个 Worker 来尝试这个模式,并使用 CountDownLatch 字段来指示它何时完成

public class Worker implements Runnable {
private List<String> outputScraper;
private CountDownLatch countDownLatch;
public Worker(List<String> outputScraper, CountDownLatch countDownLatch) {
this.outputScraper = outputScraper;
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
doSomeWork();
outputScraper.add("Counted down");
countDownLatch.countDown();
}

然后,我们创建一个测试,以证明我们可以让 CountDownLatch 等待 Worker 实例完成