功能概述
- 构造一个 可重复使用的 ,带计数器(计数递减)的 Barrier
- 每当一个线程进入Barrier(调用await),计数减一,根据减一后的结果是否为0分俩种情况。
2.1 如果是0,如果有brokenBarrier action 则执行;然后所有await的线程激活,继续执行。
2.2 如果计数>0,阻塞等待。
方法介绍
-
构造方法 :
1.1 指定计数器的初始值
1.2 指定 BrokenBarrier Action -
await :
线程执行await()方法调用后,Barrier的计数器的值减一,根据减一后的结果是否为0分俩种情况。
2.1 值>0,则阻塞当前线程;
2.2 若值==0,表示Barrier将被打破,打破后,brokenBarrier action 则执行;然后所有await的线程激活,继续执行;同时 Barrier对象重置,计数恢复。 -
reset:
重置,Barrier 前阻塞等待的线程被唤醒继续执行;未进入barrier的线程,来到时抛异常。 -
getNumberWaiting :
可获取阻塞线程数, -
isBroken:
Barrier会被破坏,比如线程异常,被中断,await()超时,reset被调用。
场景案例
- 分多次次 检索 聚合
10个部门,1年12个月份的账目,交给10个线程,分12次检索:每个线程负责一个部,每次取一个月的数据,等10个线程(部门)把当前月的数据都拿到后,聚合运算,然后继续下一个月的数据处理
CountDownLatch vs CyclicBarrier
- 都有计数器
- 计数的操控方式不同
- CountDownLatch 计数的方法是countDown()方法,非阻塞
- CyclicBarrier 计数的方法是 await(),没有非阻塞的计数控制方法。
- CyclicBarrier 可重置
网友评论