Java7并发编程--3.3、CyclicBarrier在集合点同步

时间:2022-09-03 07:34:04
        CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环的barrier。
        注意比较CountDownLatch和CyclicBarrier: 
        1. CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。 

        2. CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。

        CyclicBarrier使用int初始化,表示在某一点上同步的线程数。当一个线程到达指定点后,它将调用await()方法等待其他线程,当最后一个线程调用CyclicBarrier类的await()方法时,CyclicBarrier对象将唤醒所有在等待的线程,然后这些线程将继续执行。

        CyclicBarrier类还有一个很有意义的改进,即他可以传入另一个Runnable对象作为初始化参数,当所有线程到达集合点之后,CyclicBarrier类将这个Runnable对象作为线程执行。

Java7并发编程--3.3、CyclicBarrier在集合点同步

Java7并发编程--3.3、CyclicBarrier在集合点同步

Java7并发编程--3.3、CyclicBarrier在集合点同步

        CyclicBarrier类还提供了getNumberWaiting()方法和getParties()方法,前者返回在await()上阻塞的线程数目,后者返回被CyclicBarrier对象同步的任务数。

        CyclicBarrier对象的重置通过reset()方法完成,当重置发生后,在await()方法中等待的线程将收到一个BrokenBarrierException异常。

        CyclicBarrier对象有一种特殊的状态即损坏状态(Broken)。当很多线程在await()方法上等待的时候,若其中一个线程被中断,这个线程将抛出InterruptedException异常,其他线程将抛出BrokenBarrierException异常,于是CyclicBarrier对象就处于损坏状态。可以用isBroken()判断是否损坏。