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是否处于中断

你可能感兴趣的:(并发,并发编程)