- 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需要等待最慢的結果(短板效應),因此,最慢的也是我們今后的突破口?
