• 多线程-栅栏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

  • 相关阅读:
    Ubuntu-18.04设置花生壳内网穿透
    Ubuntu开启SSH
    Ubuntu查看版本信息
    Linux之使用mount挂载ISO镜像
    druid参数配置说明
    [转]Java多线程学习(吐血超详细总结)
    eclipse 更改官方配色
    Spring AOP拦截对Controller的请求时的配置失败
    Spring Security3详细配置
    “java.lang.IllegalArgumentException: Failed to evaluate expression ‘ROLE_USER’”报错的解决
  • 原文地址:https://www.cnblogs.com/gdpuzxs/p/6993531.html
Copyright © 2020-2023  润新知