多线程-栅栏CyclicBarrier

  上一篇总结了闭锁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

posted @ 2017-06-12 16:14  gdpuzxs  阅读(252)  评论(0编辑  收藏  举报