浅谈Java中CyclicBarrier的用法

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

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

 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 */
  1.  CyclicBarrier初始化时规定一个数目,然后计算调用了CyclicBarrier.await()进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续。 
  2.  CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。 
  3.  CyclicBarrier初始时还可带一个Runnable的参数, 此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。

 

你可能感兴趣的:(Cyclicbarrier)