java的CyclicBarrier

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()方法进行重置,这样就继续用于下一场比赛了。。。

这个东西就这么简单,有兴趣也可以看看内部实现,也不复杂~~哈哈

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。