zoukankan      html  css  js  c++  java
  • 浅谈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的数目达到后,所有其它线程被唤醒前被执行。

     

  • 相关阅读:
    Java实现 LeetCode 69 x的平方根
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 66 加一
    Java实现 LeetCode 66 加一
    CxSkinButton按钮皮肤类
  • 原文地址:https://www.cnblogs.com/techyc/p/2957059.html
Copyright © 2011-2022 走看看