栅栏 (CyclicBarrier) 的类似于闭锁,它能阻塞一组线程直到某个事件发生。栅栏与闭锁的不同之处在于,所有线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏则用于等待其他线程。
CyclicBarrier 中的计数器可以重复使用,也就是说可以使线程反复地在栅栏处聚汇集,它在并行迭代算法中非常有用: 这种算法将一个问题拆分成一系列相互独立的子问题。当线程到达栅栏位置时调用 await 方法,这个方法将一直阻塞直到所有的线程都到达栅栏的位置。如果所有线程都到达栅栏位置,栅栏将打开,所有线程被释放,同时栅栏被重置以便下次使用。
如果 await 方法调用超时,或者阻塞的线程被中断,将抛出 BrokenBarrierException 异常。如果成功通过栅栏,那么 await 将为每一个线程返回一个唯一的到达索引号,
主要源码如下:
1 |
|
示例
五个人一起去吃饭,人到齐了才开始吃,代码如下:
1 |
|
###运行结果
1 |
|