Java并发编程之CountDownLatch

Java并发之CountDownLatch详解
本文深入探讨Java并发编程中的CountDownLatch,一种用于使主线程等待其他线程完成任务的工具。介绍了CountDownLatch的基本概念、适用场景、主要方法及其优缺点,帮助读者理解并正确使用这一并发控制手段。

Java并发编程之CountDownLatch

**CountDownLatch简介:**countdownlatch是在jdk1.5时被引入,存在于java.util.cucurrent包下,被同时引入的 voncurrentHashMap和BlockingQueue。
countDownLatch用来使一个线程等待其他线程各自执行完毕后再执行。内部是通过维护一个volatile修饰的一个关键字来实现的,其值表示线程的数量,当一个线程执行完毕后,该变量值就自动减1,只有当该值为0时,代表所有线程都已执行完毕,此时所有因调用await()方法而处于等待状态的线程都被唤醒,接着往下执行。
在这里插入图片描述

CountDownLatch适用场景:
1、并行计算,当某个处理的运算量很大时,可以将该运算任务拆分成多个子任务,等待所有的子任务都完成之后,父任务再拿到所有子任务的运算结果进行汇总。
2、需要去解析一个Excel的数据,为了更快的解析,每个sheet都使用一个线程进行解析,但是最后汇总数据的工作需要等待每个sheet的解析工作完成之后才能进行
3、开启多个线程分块传输一个大数据包,每个线程只传输固定的一截,最后由另外一个线程拼接所有的分块
4、启动一个服务时,主线程需要等待多个组件加载完毕,之后再继续执行。

CountDownLatch主要方法:
1、构造函数:countdownlatch类只提供一个带一个整型参数的构造方法,参数的数值代表等待线程的个数,即需要调用countDown()的次数。

public CountDownLatch(int count) {
    if (count < 0) throw new IllegalArgumentException("count < 0");
    this.sync = new Sync(count);
}

2、countDown方法:线程通过调用该方法对count进行减1。当count等于0时,不进行任何操作,释放所有等待的线程。

public void countDown() {
        sync.releaseShared(1);
}  

3、await()方法:调用await方法时可以带参数也可以不带参数。
不带参数的await方法只有在线程被打断或者count=0时才会返回,否则线程会一直等待。

public void await() throws InterruptedException {
    sync.acquireSharedInterruptibly(1);
}

带参数的await方法除了在count=0、线程被打断时会返回,而且在设定的timeout时间到的时候也会自动返回。

public boolean await(long timeout, TimeUnit unit)
    throws InterruptedException {
    return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
}

为了实现await方法的功能我们还可以用如下两种方法,但是这两种方法都有各自的弊端。
1、利用线程的join()方法,让当前线程等待join线程执行结束。其原理是不停检查join线程是否存活,如果join线程存活则当前线程永远等待。
2、利用线程间wait/notify,进入synchronized同步块或方法中,检查计数器值不为0,然后调用Object.wait();直到值为0则调用notifyAll()唤醒等待线程。
对于方法1:如果只有两三个线程还好,但是如果数量过多,需要写过多的join,而且提前结束任务时还得捕获InterruptException异常,比较繁琐。
对于方法2:使用了大量synchronized同步块,而且还可能存在假唤醒,不安全。

CountDownLatch的优缺点:
优点:对使用者而言,只需要传入一个int型变量控制任务数量即可。
缺点:CountDownLatch是一次性的,计数器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当CountDownLatch使用完毕后,它不能再次被使用。

本文参考
本文主要参考以下文章,谨以技术分享为目的,将此文搬到优快云上,如有侵权问题请联系本人,乐于分享提高。
作者: Mr.Yanphet
链接:https://www.cnblogs.com/yanphet/p/5788260.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值