JAVA多线程CyclicBarrier应用

 

一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。

 

CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。

 

  1. package  com.jeyo.java5;   
  2.   
  3. import  java.util.concurrent.BrokenBarrierException;   
  4. import  java.util.concurrent.CyclicBarrier;   
  5.   
  6. public   class  Test3 {   
  7.      //一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)   
  8.      final  CyclicBarrier barrier;   
  9.        
  10.      //线程数   
  11.      int  count;   
  12.        
  13.      class  Worker  implements  Runnable{   
  14.          int  index;   
  15.         Worker( int  index){   
  16.              this .index = index;   
  17.         }   
  18.          public   void  run() {   
  19.             System.out.println( "第"  + index +  "个线程休眠" +( 2  * index)+ "秒!" );   
  20.              try  {   
  21.                 Thread.sleep( 2000  * index);   
  22.             }  catch  (InterruptedException e) {   
  23.                 e.printStackTrace();   
  24.             }   
  25.             System.out.println( "第"  + index +  "个线程结束休眠!" );   
  26.                
  27.              try  {   
  28.                  //等待其它线程都处理完毕后,再继续以下代码的执行   
  29.                 barrier.await();   
  30.             }  catch  (InterruptedException e) {   
  31.                 e.printStackTrace();   
  32.             }  catch  (BrokenBarrierException e) {   
  33.                 e.printStackTrace();   
  34.             }   
  35.                
  36.             System.out.println(index);   
  37.         }   
  38.     }   
  39.        
  40.      public  Test3( int  count){   
  41.          this .count = count;   
  42.            
  43.          //公共屏障点 等待到5个线程后,执行相应的barrierAction   
  44.         barrier =  new  CyclicBarrier(count,  new  Runnable() {   
  45.              public   void  run(){   
  46.                 System.out.println( "全部线程已执行完毕!" );   
  47.             }   
  48.         });   
  49.            
  50.          for ( int  i= 1 ;i<= this .count;i++){   
  51.              new  Thread( new  Worker(i)).start();   
  52.         }   
  53.     }   
  54.        
  55.      public   static   void  main(String[] args) {   
  56.          new  Test3( 5 );   
  57.     }   

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值