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的数目达到后,所有其它线程被唤醒前被执行。

     

  • 相关阅读:
    Spring Security简介与入门Demo
    电商项目之多功能增删改查案例
    linux-用户管理
    zabbix3.4配置第三方邮件报警
    zabbix3.4配置客户端配置
    centos7上安装zabbix3.4的详细步骤与问题处理记录
    MyBatis日记(五):一对一关系,一对多关系
    MyBatis日记(四):MyBatis——insert、update、delete、select
    Python日记(二):Python之禅
    Python日记(一):拜见小主——Python
  • 原文地址:https://www.cnblogs.com/techyc/p/2957059.html
Copyright © 2011-2022 走看看