指定数量的线程所有调用 cyclicBarrier的await()方法时,这些线程再也不阻塞
java
经过reset()方法能够进行重置
git
public CyclicBarrier(int parties)
多线程
`public CyclicBarrier(int parties, Runnable barrierAction)
设置屏障打开前首先运行的线程即该线程的执行时机是在到达屏障以后再执行`ide
`一、初始化50000条数据
二、经过5个线程并行处理 每个线程分别处理10000条数据(经过线程池中的5个线程处理)
三、而后将5个线程分别的处理结果汇总(经过初始化栅栏的时候第二个构造函数定义的那个线程处理即Runnable barrierAction)`函数
`isBroken()
默认为true
状态被改变的场景:
1.等待线程被interrupt
2.等待线程timeout
三、其余线程调用reset(),将其重置为true`源码分析
barrier.getParties()
spa
barrier.getNumberWaiting()
.net
`形象的理解:每有一个线程达到栅栏,就会向栅栏报道,等到齐了指定人数,栅栏就会打开,让这些数量的线程经过
该状态被终止的场景:
1.屏障打开
2.本线程被interrupt
3.其余等待线程被interrupted
4.其余等待线程timeout
5.其余线程调用reset()`线程
`该状态被终止的场景:
1.屏障打开(返回true)
2.本线程被interrupt
3.本线程timeout
4.其余等待线程被interrupted
5.其余等待线程timeout
6.其余线程调用reset()`code
`reset()
将CyclicBarrier回归初始状态,若是有正在等待的线程,则会抛出BrokenBarrierException异常`
CyclicBarrier
线程相互等待
能够重置count
CountDownLatch
当前线程等待一个或多个线程
count=0,不可重置
await方法
同时,Generation描述着CyclicBarrier的更新换代。在CyclicBarrier中,同一批线程属于同一代。当有parties个线程到达barrier以后,generation就会被更新换代。其中broken标识该当前CyclicBarrier是否已经处于中断状态。
默认barrier是没有损坏的。当barrier损坏了或者有一个线程中断了,则经过breakBarrier()来终止全部的线程
`这里先简单介绍下和synchronized区别 下一节再详细的说下
(1)synchronized是独占锁,加锁和解锁的过程自动进行,易于操做,但不够灵活。ReentrantLock也是独占锁,加锁和解锁的过程须要手动进行,不易操做,但很是灵活。
(2)synchronized可重入,由于加锁和解锁自动进行,没必要担忧最后是否释放锁;ReentrantLock也可重入,但加锁和解锁须要手动进行,且次数需同样,不然其余线程没法得到锁。
(3)synchronized不可响应中断,一个线程获取不到锁就一直等着;ReentrantLock能够相应中断。
(4)ReentrantLock还能够实现公平锁机制 通俗的理解就是谁排队时间最长谁先执行获取锁`
https://gitee.com/pingfanrenbiji/myconcurrent/blob/master/src/main/java/pers/hanchao/concurrent/eg15/CyclicBarrierDemo.java
`https://blog.csdn.net/qq_3829...
https://baijiahao.baidu.com/s...`
本文使用 mdnice 排版