Java 多线程 - CountDownLatch & CyclicBarrier

CountDownLatch VS CyclicBarrier 

  • CountDownLatch 的计数器只能使用一次,而 CyclicBarrier 的计数器可以反复使用
  • 在控制多个线程同时运行上,CountDownLatch 可以不限线程数量,而 CyclicBarrier 是固定线程数。
  • CyclicBarrier 还可以􏰀供一个 barrierAction(优先执行这个action),合并多线程计算结果

 

CountDownLatch

CountDownLatch 功能

闭锁,CountDownLatch 这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动 所有的框架服务之后再执行。

CountDownLatch 是通过一个计数器来实现的,计数器的初始值为初始任务的数量。每当完成了一个任务后,计数器的值就会减 1 (CountDownLatch.countDown()方法)。当计数器值到达 0 时,它表示所有的已 经完成了任务,然后在闭锁上等待 CountDownLatch.await()方法的线程就可以恢 复执行任务

 

1
CountDownLatch 的计数器只能使用一次

 

CountDownLatch 图解

TW1, TW2 两个线程在执行到某个节点时,调用了CountDownLatch.await()方法,表示在该闭锁上等待。这里假设闭锁初始化值为5。

Ta,Tb,Tc,Td 四个线程会去调用CountDownLatch.countDown()方法,可以看到:

  • 一个线程多次调用countDown()方法
  • 一个线程调用countDown()方法后,可以继续运行,可以死亡

 

 

 

 

回到顶部(go to top)

CyclicBarrier

CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做 的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一 个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。 

  • CyclicBarrier 默认的构造方法是 CyclicBarrier(int parties),其参数表示屏障拦截 的线程数量,每个线程调用 await 方法告诉 CyclicBarrier 我已经到达了屏障,然 后当前线程被阻塞。
  • CyclicBarrier 还􏰀供一个更高级的构造函数 CyclicBarrie(r int parties,Runnable barrierAction),用于在线程到达屏障时,优先执行 barrierAction,方便处理更复杂的业务场景。

CyclicBarrier 可以用于多线程计算数据,最后合并计算结果的场景。

 

 

 

 

 

posted on   frank_cui  阅读(138)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

levels of contents
点击右上角即可分享
微信分享提示