浅谈Java中CyclicBarrier的用法

来源:互联网 发布:php 敏感词过滤 编辑:程序博客网 时间:2024/05/17 02:54

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         @Override14         public void run() {15             // TODO Auto-generated method stub16             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 args30      */31     public static void main(String[] args) {32         // TODO Auto-generated method stub33         CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() {34             //当所有线程到达barrier时执行35             @Override36             public void run() {37                 // TODO Auto-generated method stub38                 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 waiting52 Worker's waiting53 Worker's waiting54 Worker's waiting55 Worker's waiting56 Inside Barrier57 ID:12 Working58 ID:8 Working59 ID:11 Working60 ID:9 Working61 ID:10 Working62 */
复制代码
  1.  CyclicBarrier初始化时规定一个数目,然后计算调用了CyclicBarrier.await()进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续。 
  2.  CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。 
  3.  CyclicBarrier初始时还可带一个Runnable的参数, 此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。
原创粉丝点击