写点什么

CountDownLatch

作者:周杰伦本人
  • 2022 年 6 月 06 日
  • 本文字数:1310 字

    阅读完需:约 4 分钟

CountDownLatch

示例

public class JoinCountDownLatchTest {    public static void main(String[] args) throws InterruptedException {        Thread parser1 = new Thread(new Runnable() {            @Override            public void run() {                System.out.println("parser1 finish");            }        });        Thread parser2 = new Thread(new Runnable() {            @Override            public void run() {                System.out.println("parser2 finish");            }        });        parser1.start();        parser2.start();        parser1.join();        parser2.join();        System.out.println("all parser finish");    }}
复制代码


join 用于让当前执行线程等待 join 线程执行结束。其实现原理是不停检查 join 线程是否存活,如果 join 线程存活则让当前线程永远等待。其中,wait(0)表示永远等待下去,代码片段如下。


while (isAlive()) {    wait(0);}
复制代码


直到 join 线程中止后,线程的 this.notifyAll()方法会被调用,调用 notifyAll()方法是在 JVM 里实现的,所以在 JDK 里看不到的 CountDownLatch 也可以实现 join 的功能,并且比 join 的功能更多


import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest { static CountDownLatch c = new CountDownLatch(2);
public static void main(String[] args) throws InterruptedException { new Thread(new Runnable() { @Override public void run() { System.out.println(1); c.countDown(); System.out.println(2); c.countDown(); } }).start(); c.await(); System.out.println("3"); }}
复制代码


CountDownLatch 的构造函数接收一个 int 类型的参数作为计数器,如果你想等待 N 个点完成,这里就传入 N。当我们调用 CountDownLatch 的 countDown 方法时,N 就会减 1,CountDownLatch 的 await 方法会阻塞当前线程,直到 N 变成零。由于 countDown 方法可以用在任何地方,所以这里说的 N 个点,可以是 N 个线程,也可以是 1 个线程里的 N 个执行步骤。用在多个线程时,只需要把这个 CountDownLatch 的引用传递到线程里即可。如果有某个解析 sheet 的线程处理得比较慢,我们不可能让主线程一直等待,所以可以使用另外一个带指定时间的 await 方法——await(long time,TimeUnit unit),这个方法等待特定时间后,就会不再阻塞当前线程。join 也有类似的方法。计数器必须大于等于 0,只是等于 0 时候,计数器就是零,调用 await 方法时不会阻塞当前线程。CountDownLatch 不可能重新初始化或者修改 CountDownLatch 对象的内部计数器的值。一个线程调用 countDown 方法 happen-before,另外一个线程调用 await 方法。

总结

本篇主要介绍了 CountDownLatch 的一些基本新,它的 await 方法阻塞当前的线程,当计数器减到 0 的是才会放行线程,用在多个线程时,只需要把这个 CountDownLatch 的引用传递到线程里即可。这就是 CountDownLatch 的一些特点,和它经常在一块比较的 CycleBarrier,下篇文章中我们再介绍

发布于: 刚刚阅读数: 5
用户头像

还未添加个人签名 2020.02.29 加入

还未添加个人简介

评论

发布
暂无评论
CountDownLatch_6月月更_周杰伦本人_InfoQ写作社区