注意比较CountDownLatch和CyclicBarrier:
1. CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。
2. CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。
CyclicBarrier使用int初始化,表示在某一点上同步的线程数。当一个线程到达指定点后,它将调用await()方法等待其他线程,当最后一个线程调用CyclicBarrier类的await()方法时,CyclicBarrier对象将唤醒所有在等待的线程,然后这些线程将继续执行。
CyclicBarrier类还有一个很有意义的改进,即他可以传入另一个Runnable对象作为初始化参数,当所有线程到达集合点之后,CyclicBarrier类将这个Runnable对象作为线程执行。
CyclicBarrier类还提供了getNumberWaiting()方法和getParties()方法,前者返回在await()上阻塞的线程数目,后者返回被CyclicBarrier对象同步的任务数。
CyclicBarrier对象的重置通过reset()方法完成,当重置发生后,在await()方法中等待的线程将收到一个BrokenBarrierException异常。
CyclicBarrier对象有一种特殊的状态即损坏状态(Broken)。当很多线程在await()方法上等待的时候,若其中一个线程被中断,这个线程将抛出InterruptedException异常,其他线程将抛出BrokenBarrierException异常,于是CyclicBarrier对象就处于损坏状态。可以用isBroken()判断是否损坏。