CountDownLatch
CountDownLatch
- CountDownLatch 是一种通用的同步工具CountDownLatch内部的实现主要是依靠AQS的共享模式。
- 当一个线程把CountDownLatch初始化了一个count之后,其他的线程调用await就会阻塞住,直到其他的线程一个一个调用countDown方法进行release操作,把count的值减到0,即把同步锁释放掉,await才会进行下去。比如有一个主线程A,它要等待其他4个子线程执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。
- 是并发包中的一个工具类,它的典型应用场景为:一个线程等待几个线程执行,待这几个线程结束后,该线程再继续执行。
- CountDownLatch通过AQS(AbstractQueuedSynchronizer)里面的共享锁来实现的。
属性
CountDownLatch是通过AbstractQueuedSynchronizer的实现类Sync进行实现
private final Sync sync;
构造函数
//传入count计数值构造CountDownLatch实例 public CountDownLatch(int count) { //如果count小于0,抛出IllegalArgumentException异常 if (count < 0) throw new IllegalArgumentException("count < 0"); //调用上面的介绍的Sync的构造函数,将计数值count设置为sync从AQS继承下来的state属性,不清楚的可以看下上面对Sync的介绍 this.sync = new Sync(count); } |
主要方法
//等待,直到count到0再执行,或者线程被中断 public void await() throws InterruptedException { //调用sync的acquireSharedInterruptibly方法进入等待 sync.acquireSharedInterruptibly(1); } //设置超时时间的等待 public boolean await(long timeout, TimeUnit unit) throws InterruptedException { //调用sync的tryAcquireSharedNanos方法进入等待 return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout)); } //count 减1 public void countDown() { //调用sync的releaseShared方法 sync.releaseShared(1); } //获取count public long getCount() { //调用sync的getCount return sync.getCount(); } |
使用
public static void main(String[] args) throws InterruptedException { final CountDownLatch latch = new CountDownLatch(5); for (int i = 0; i < 5; i++) { new Thread(() -> { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("子线程执行"); latch.countDown(); }).start(); } latch.await(); System.out.println("主线程执行"); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具