Java JUC工具类--CyclicBarrier

  • CyclicBarrier:栅栏的概念,多线程的进行阻塞,等待某一个临界值条件满足后,同时执行
  •  类比:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待
package com.example.core.juc;

import java.util.Random;
import java.util.concurrent.*;

public class UseCyclicBarrier {
    static class Runner implements Runnable{
        private String name;
        private CyclicBarrier cyclicBarrier;

        public Runner(String name,CyclicBarrier cyclicBarrier){
            this.name = name;
            this.cyclicBarrier = cyclicBarrier;
        }

        @Override
        public void run(){
            try {
                System.out.println("运动员:" +this.name +", 进行准备工作");
                Thread.sleep(1000*(new Random()).nextInt(10));//模拟每一个运动员的休整时间
                System.out.println("运动员:"+this.name +",准备OK!");
                this.cyclicBarrier.await();//只有所有运动员都休整完毕,才会同时启动
            }catch(InterruptedException e){
                e.printStackTrace();
            }catch(BrokenBarrierException e){
                e.printStackTrace();
            }
            System.out.println("运动员:"+this.name+",Go!Go!Go!");
        }
    }

    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3);//线程池
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        executorService.submit(new Thread(new Runner("张三",cyclicBarrier)));
        executorService.submit(new Thread(new Runner("里斯",cyclicBarrier)));
        executorService.submit(new Thread(new Runner("王武",cyclicBarrier)));
        executorService.shutdown();//关闭线程池
    }
}
/*
运动员:张三, 进行准备工作
运动员:王武, 进行准备工作
运动员:里斯, 进行准备工作
运动员:张三,准备OK!
运动员:里斯,准备OK!
运动员:王武,准备OK!
运动员:张三,Go!Go!Go!
运动员:王武,Go!Go!Go!
运动员:里斯,Go!Go!Go!
*/
  • 适用于如下情况,外部请求调用的函数由四部分组成,分别是1、2、3和4,第4部分需要1、2和3的结果作为输入值,并且他们将数据传给4的时间是不同的,所以4需要等待最慢的结果(短板效应),因此,最慢的也是我们今后的突破口 

发布了53 篇原创文章 · 获赞 1 · 访问量 1122

猜你喜欢

转载自blog.csdn.net/CHYabc123456hh/article/details/104721119