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(); 

 

 

 

 

 

你可能感兴趣的:(thread)