cyclicbarrier
一、CyclicBarrier作用
它允许一组线程互相等待,直到到达某个公共屏障点。在设计一组固定大小的线程的程序中,这些线程必须不时地相互等待,这时CyclicBarrier很有用。因为该Barrier在释放线程后可以重用,所以称它为循环(Cyclic)的屏障(Barrier)。
二、CyclicBarrier内部实现
CyclicBarrier的内部是使用重入锁ReentrantLock和Condition。
1.构造方法CyclicBarrier(int parties)它将在给定数量的线程处于等待状态时启动,但它不会在启动barrier时执行预定义的操作
2.CyclicBarrier(int parties,Runnable BarrierAction)它将在给定数量的线程处于等待状态时启动,并在启动barrier时执行给定的屏障操作,该操作由最后一个进入barrier的线程执行。
三、await
让所有线程在barrier调用await方法之前一直等待。内部调用了dowait方法,返回值为剩余等待线程的数量
await() 不超时等待
await(long timeout,TimeUnit unit)内部调用dowait(boolean timed,long nanos方法
四、如果该线程不是最后一个到达的线程,会一直处于等待状态除非一下情况
1.最后一个线程到达,即index==0
2.超出了等待时间
3.其他线程终止了当前线程
4.其他的某个线程中断另一个等待的线程
5.其他的某个线程在等待barrier超时
6.其他的某个线程在barrier调用reset方法
五、什么时候抛出BorkenBarrierException异常
1.如果一个线程处于等待状态时,如果其他线程调用reset方法。
2.调用的barrier原本就是被破坏的,则抛出brokenBarrierException
3.任何线程在等待时被中断了,则其他所有线程都将抛出BrokenBarrierException异常,并将Barrier置于损坏状态
六、Generation
Generarion是CyclicBarrier静态内部类,描述了CyclicBarrier的更新,在CyclicBarrier中,同一批线程属于同一代。当有parties个线程全部达到barrier时,generation就会被更新换代。其中broken属性,表示CyclicBarrier是否处于中断状态
七、BreakBarrier
当barrier损坏了,或者有一个线程中断了,则通过breakBarrier方法来终止所有的线程。
代码中将broken标志设为true,并调用signalAll方法,将在CyclicBarrier中处于等待状态的线程全部唤醒
八、nextGeneration
当index等于0时,会调用nextGeneration方法,进行更新操作
1.唤醒所有线程
2.重置count
3.重置generation
九、reset
reset方法,充值barrier到初始化的状态
通过调用breakbarrier和nextGeneration来实现
十、getNumberWait
用于获取等待的线程数
十一、isBreak
用于判断CyclicBarrier是否处于中断
相关阅读
CyclicBarrier是多线程中一个重要的类,主要用于线程组内部之间的线程的相互等待问题。 1.CyclicBarrier的工作原理 Cycli