Java多线程之CyclicBarrier

Java多线程之CyclicBarrier

 

  1. import  java.util.Random;  
  2. import  java.util.concurrent.CyclicBarrier;  
  3.   
  4. /**  
  5.  * CyclicBarrier类似于CountDownLatch也是个计数器,  
  6.  * 不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,  
  7.  * 当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。  
  8.  * CyclicBarrier就象它名字的意思一样,可看成是个障碍,  
  9.  * 所有的线程必须到齐后才能一起通过这个障碍。  
  10.  * CyclicBarrier初始时还可带一个Runnable的参数,  
  11.  * 此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。  
  12.  */   
  13. public   class  CyclicBarrierTest {  
  14.   
  15.     public   static   class  ComponentThread  implements  Runnable {  
  16.         CyclicBarrier barrier;// 计数器   
  17.         int  ID;  // 组件标识   
  18.         int [] array;     // 数据数组   
  19.   
  20.         // 构造方法   
  21.         public  ComponentThread(CyclicBarrier barrier,  int [] array,  int  ID) {  
  22.             this .barrier = barrier;  
  23.             this .ID = ID;  
  24.             this .array = array;  
  25.         }  
  26.   
  27.         public   void  run() {  
  28.             try  {  
  29.                 array[ID] = new  Random().nextInt( 100 );  
  30.                 System.out.println("Component "  + ID +  " generates: "  + array[ID]);  
  31.                 // 在这里等待Barrier处   
  32.                 System.out.println("Component "  + ID +  " sleep..." );  
  33.                 barrier.await();  
  34.                 System.out.println("Component "  + ID +  " awaked..." );  
  35.                 // 计算数据数组中的当前值和后续值   
  36.                 int  result = array[ID] + array[ID +  1 ];  
  37.                 System.out.println("Component "  + ID +  " result: "  + result);  
  38.             } catch  (Exception ex) {  
  39.             }  
  40.         }  
  41.     }  
  42.     /**  
  43.      * 测试CyclicBarrier的用法  
  44.      */   
  45.     public   static   void  testCyclicBarrier() {  
  46.         final   int [] array =  new   int [ 3 ];  
  47.         CyclicBarrier barrier = new  CyclicBarrier( 2new  Runnable() {  
  48.             // 在所有线程都到达Barrier时执行   
  49.             public   void  run() {  
  50.                 System.out.println("testCyclicBarrier run..." );  
  51.                 array[2 ] = array[ 0 ] + array[ 1 ];  
  52.             }  
  53.         });  
  54.   
  55.         // 启动线程   
  56.         new  Thread( new  ComponentThread(barrier, array,  0 )).start();  
  57.         new  Thread( new  ComponentThread(barrier, array,  1 )).start();  
  58.     }  
  59.   
  60.     public   static   void  main(String[] args) {  
  61.         CyclicBarrierTest.testCyclicBarrier();  
  62.     }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值