CyclicBarrier用法

时间:2021-08-18 16:33:14

CyclicBarrier和CountDownLatch一样,都是关于线程的计数器。

用法略有不同,测试代码如下:

CyclicBarrier用法
 1 public class TestCyclicBarrier {
2
3 private static final int THREAD_NUM = 5;
4
5 public static class WorkerThread implements Runnable{
6
7 CyclicBarrier barrier;
8
9 public WorkerThread(CyclicBarrier b){
10 this.barrier = b;
11 }
12
13 @Override
14 public void run() {
15 // TODO Auto-generated method stub
16 try{
17 System.out.println("Worker's waiting");
18 //线程在这里等待,直到所有线程都到达barrier。
19 barrier.await();
20 System.out.println("ID:"+Thread.currentThread().getId()+" Working");
21 }catch(Exception e){
22 e.printStackTrace();
23 }
24 }
25
26 }
27
28 /**
29 * @param args
30 */
31 public static void main(String[] args) {
32 // TODO Auto-generated method stub
33 CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() {
34 //当所有线程到达barrier时执行
35 @Override
36 public void run() {
37 // TODO Auto-generated method stub
38 System.out.println("Inside Barrier");
39
40 }
41 });
42
43 for(int i=0;i<THREAD_NUM;i++){
44 new Thread(new WorkerThread(cb)).start();
45 }
46 }
47
48 }
49 /*
50 以下是输出:
51 Worker's waiting
52 Worker's waiting
53 Worker's waiting
54 Worker's waiting
55 Worker's waiting
56 Inside Barrier
57 ID:12 Working
58 ID:8 Working
59 ID:11 Working
60 ID:9 Working
61 ID:10 Working
62 */
CyclicBarrier用法
  1. CyclicBarrier初始化时规定一个数目,然后计算调用了CyclicBarrier.await()进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续。
  2. CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。
  3. CyclicBarrier初始时还可带一个Runnable的参数, 此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。