juc并发控制--CountDownLatch使用

CountDownLatch是Java并发工具包中的一种同步工具类,类似于Thread的join但提供了更精细的控制。本文介绍其基本用法并对比了与join的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

juc(java.util.concurrent)包是Doug Lea大神为了解决jdk内置的高并发机制性能问题,设计的一套高并发,大神希望它能够成为高并发需求的基础。今天我们讲解它的4大并发工具之一:CountDownLatch。

CountDownLatch类
CountDownLatch 是juc包下的一个同步工具类,功能同java内置 Thread 的join很相似,同时功能和性能又高于join,处理细节的能力比join更为精确。CountDownLatch本质是一个高并发计数器,初始化是需要给它设置计数器初始值。
CountDownLatch的3个常用方法:
public CountDownLatch(int count) 构造方法,设置计数器出事值。
public void await(); 函数用于阻塞当前线程直到CountDownLatch的计数值变为0时,当前线程才能重新唤起运行。
public void countDown(); 方法用于将当前CountDownLatch的计数值减1

使用
假设现在公司有三个员工A,B,C,他们要开会。但是A需要等B,C准备好之后再才能开始,B,C需要同时准备。代码:
Employee.java:
public class Employee extends Thread{ private String employeeName; private long time; private CountDownLatch countDownLatch; public Employee(String employeeName,long time, CountDownLatch countDownLatch){ this.employeeName = employeeName; this.time = time; this.countDownLatch = countDownLatch; } @Override public void run() { try { System.out.println(employeeName+ "开始准备"); Thread.sleep(time); System.out.println(employeeName+" 准备完成"); countDownLatch.countDown(); } catch (Exception e) { e.printStackTrace(); } }}

CountDownLatchTest.java:
public class CountDownLatchTest { public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(2); Employee a = new Employee("A", 3000,countDownLatch); Employee b = new Employee("B", 3000,countDownLatch); Employee c = new Employee("C", 4000,countDownLatch); b.start(); c.start(); countDownLatch.await(); System.out.println("B,C准备完成"); a.start(); }}
输出结果如下:
B开始准备C开始准备B 准备完成C 准备完成B,C准备完成A开始准备A 准备完成

上述就是CountDownLatch类的常规用法,大家可能会注意到,其实上述过程用Thread的join方法也能实现。确实CountDownLatch解决的场景大部分都能用join解决。但是需要注意一个区别: join是需要线程run方法全部执行完才能执行另一个等待线程,而CountDownLatch就不需要,在线程执行过程中,只要countDown让计数器到0,那么await线程就能继续执行,不需要countDown线程的run执行完成。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值