CountDownLatch的使用方法

本文通过一个具体示例详细解析了CountDownLatch如何使主线程等待所有子线程完成工作。通过对比带与不带await()的方法,展示了CountDownLatch在并发编程中的作用。

CountDownLatch使得使用CountDownLatch.await()的线程(当前线程)阻塞直到所有其它拥有CountDownLatch的线程执行完毕(countDown()结果为0)。例子如下:


第18行:endLatch.await()使得主线程(main)阻塞直到endLatch.countDown()为零才继续执行,在每个线程执行完毕的时候都调用一下countDown()(第37行),所以当所有线程都执行完毕后countDown()变为零,这个时候主线程开始继续执行。

运行结果如下:(每次运行的结果可能不同)


可以试试,把第18行注释掉,执行结果如下:(每次的运行结果可能不同)



可以看到所有的线程并没有执行完毕就打印出了"All threads are finished."
使用CountDownLatch有三个主要步骤:首先创建CountDownLatch实例时通过构造函数指定计数器的值N;然后需要等待的线程调用CountDownLatch实例的await方法,等待计数器的值将为0;被等待的线程在任务完成时调用CountDownLatch实例的countDown方法,计数器的值减一 [^1]。 CountDownLatch实例化时构造方法要求传入一个int类型参数作为计数器。countDown()方法使计数器减1。await()、await(long, TimeUnit)方法使主线程加入阻塞队列,等待子线程执行完成 [^2]。 以下是一个简单的CountDownLatch实现示例: ```java public class SimpleCountDownLatch { private int limit; public SimpleCountDownLatch(int limit) { this.limit = limit; } public void await() throws InterruptedException { synchronized (this) { // 当limit>0时,当前线程进入阻塞状态 while (limit > 0) { this.wait(); } } } public void countDown() { synchronized (this) { if (limit <= 0) { throw new IllegalStateException("count has already reached zero"); } // 使limit减一,并且通知阻塞线程 limit--; this.notifyAll(); } } public synchronized int getUnarrived() { // 返回有多少线程还未完成任务 return limit; } } ``` CountDownLatch的业务场景包括:串行任务相互结果不影响改为并行任务;批量任务处理(订单处理、日志存储、用户请求统计);多个子线程更新同一个共享变量(消息队列、爬虫系统、任务调度);需要等待所有异步任务完成再返回(ETL数据处理、支付对账) [^2][^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值