- 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;}@Overridepublic 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需要等待最慢的结果(短板效应),因此,最慢的也是我们今后的突破口