上一篇总结了闭锁CountDownLatch,这一篇总结一下栅栏CyclicBarrier。它们两者之间的区别主要是,闭锁是等待一个事件发生,比如上一篇的田径比赛,运动员等待裁判哨声一响就可以开始跑,假如这个时候某个选手走神了,还没准备就绪,这个时候其他队员不需要等待他准备就绪才可以开始跑。
而栅栏呢,就必须等待所有队员准备就绪的时候,才可以开始跑。类似生活中,我们几个人约好出去春游,出发前,我们在某一个地点集合,等所有人都到齐的时候,我们才开始搭车出去春游,如果某一个小伙伴还没到聚集地,我们就一直等到他到了,才开始出发。
闭锁用于等待事件,而栅栏用于等待其他线程准备就绪。下面看一下例子:
package cyclicBarrier.cyclicBarrier; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CyclicBarrierDemo { public static void main(String []args){ ExecutorService exec=Executors.newCachedThreadPool(); final CyclicBarrier barrier=new CyclicBarrier(5, new Runnable() { public void run() { System.out.println("大家都到齐了,一起出发..."); } }); for(int i=1;i<=5;i++){ final int num=i; Thread thread=new Thread(new Runnable() { public void run() { try { Thread.sleep((long) (Math.random()*10000)); System.out.println(num+"号已经到达目的地.."); barrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }); exec.execute(thread); } exec.shutdown(); } }
运行结果如下:
参考地址:JAVA并发编程实战
http://m.jb51.net/article/63970.htm