CountDownLatch

          CountDownLatchjava concurrent 包里一个用于并发流程控制的类。顾名思义,它是一个倒计数的计数器。给计数器初始化一个值,调用countdown()方法来原子的减小这个值,另外有一个await()方法一直阻塞等待这个值减为0,当减为0的时候解除阻塞。继续执行。

           CountdownLatch是一个同步工具,有很多的用途

(1)    把计数1初始化为CountDownLatch的初值

      做一个开关,或入口。有这样一个例子,比如赛马。裁判员线程发号施令,他持有countdown()函数,所有的赛马线程都调用await()阻塞等待施令。当countdown()调用, CountDownLatch变为0,所有的赛马线程解除阻塞,开始run. 

 

 

final CountDownLatch startLatch= new CountDownLatch(1); 
      for(int i = 0; i < 10; ++i) { 
          Thread thread= newThread("worker thread "+ i) { 
          public void run() { 
               try{
                      startLatch.await(); 
               }catch(InterruptedExceptione){
               return; 
               } // do xxxx 
         } 
     }; 
     thread.start(); 
} // do xxx 
startLatch.countDown(); 

 

 

 

(2)    把计数初始化为N

         这样可以使一个线程在N个线程完成某项操作之前一直等待,或者说等待某个线程完成N次操作。以赛马为例。终点统计员线程要等到N匹马到达终点后才汇总结果,所以他在await(),每当一个马达到终点,它就countdown(),当CountDownLatch变为0的时候,所有的马都到达终点了,await()解除阻塞,统计员统计结果。继续往下执行。

final int COUNT = 10;  
final CountDownLatch completeLatch = newCountDownLatch(COUNT); 
for (int i = 0; i < COUNT; ++i) { 
     Thread thread= newThread("worker thread "+ i) { 
          public void run() { 
          // do xxxx 
          completeLatch.countDown(); 
          } 
     }; 
     thread.start(); 
} 
completeLatch.await(); 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值