CyclicBarrier直译叫循环屏障,作用有点像赛跑时吹哨的角色,它有2个构造方法,一个是int的arg1,另一个多了一个Runable的arg2
arg1:可以看做此次参加赛跑的人数
arg2:可以看做是吹哨这个动作它是在所有人都已经准备好后且在开跑前执行
1 public class Test { 2 3 private static Executor executor = Executors.newCachedThreadPool(); 4 5 public static void main(String[] args) throws InterruptedException { 6 int sporterCount = 5; 7 CyclicBarrier cyclicBarrier = new CyclicBarrier(sporterCount, new Runnable() { 8 @Override 9 public void run() { 10 System.out.println("吹黑哨。。。"); 11 } 12 }); 13 for (int i = 0; i < sporterCount; i++) { 14 executor.execute(new Sporter(i + 1, cyclicBarrier)); 15 } 16 } 17 } 18 19 20 class Sporter implements Runnable { 21 22 private int no; 23 private CyclicBarrier cyclicBarrier; 24 25 public Sporter(int no, CyclicBarrier cyclicBarrier) { 26 this.no = no; 27 this.cyclicBarrier = cyclicBarrier; 28 } 29 30 @Override 31 public void run() { 32 System.out.println("第" + no + "号已经准备好"); 33 try { 34 this.cyclicBarrier.await();//通知吹黑哨的准备好了 35 } catch (InterruptedException e) { 36 e.printStackTrace(); 37 } catch (BrokenBarrierException e) { 38 e.printStackTrace(); 39 } 40 System.out.println("第" + no + "号已开跑"); 41 } 42 }
输出结果:
第1号已经准备好 第4号已经准备好 第3号已经准备好 第5号已经准备好 第2号已经准备好 吹黑哨。。。 第2号已开跑 第1号已开跑 第4号已开跑 第3号已开跑 第5号已开跑
最后他还有个reset()方法进行重置,这样就继续用于下一场比赛了。。。
这个东西就这么简单,有兴趣也可以看看内部实现,也不复杂~~哈哈
时间: 2024-10-29 04:56:48