同步工具之CountdownLatch

CountdownLatch至關於一個倒計時的計數器,當計數到達0時,等待這個計數器的線程就開始執行。java

下面經過代碼看一下CountdownLatch的執行效果。dom

  • 1-1 一個CountdownLatch的例子
  •    
       
       
       
    1. import java.util.concurrent.CountDownLatch; 
    2. import java.util.concurrent.ExecutorService; 
    3. import java.util.concurrent.Executors; 
    4.  
    5. public class CountdownLatchTest { 
    6.     public static void main(String[] args) { 
    7.         ExecutorService service = Executors.newCachedThreadPool(); 
    8.         final CountDownLatch cdOrder = new CountDownLatch(1);//計數器的初始值爲1 
    9.         final CountDownLatch cdAnswer = new CountDownLatch(3);//計數器的初始值爲3    
    10.         for(int i=0;i<3;i++){//啓動3個線程 
    11.             Runnable runnable = new Runnable(){ 
    12.                     public void run(){ 
    13.                     try { 
    14.                         System.out.println("線程" + Thread.currentThread().getName() +  
    15.                                 "正準備接受命令");                      
    16.                         cdOrder.await();//3個線程都在等待計數器,當計數爲0時,都開始往下執行 
    17.                         System.out.println("線程" + Thread.currentThread().getName() +  
    18.                         "已接受命令");                                
    19.                         Thread.sleep((long)(Math.random()*10000));   
    20.                         System.out.println("線程" + Thread.currentThread().getName() +  
    21.                                 "迴應命令處理結果");                         
    22.                         cdAnswer.countDown();//每一個線程結束的時候把計數器減1                       
    23.                     } catch (Exception e) { 
    24.                         e.printStackTrace(); 
    25.                     }                
    26.                 } 
    27.             }; 
    28.             service.execute(runnable); 
    29.         }        
    30.         try {//主線程 
    31.             Thread.sleep((long)(Math.random()*10000)); 
    32.          
    33.             System.out.println("線程" + Thread.currentThread().getName() +  
    34.                     "即將發佈命令");                       
    35.             cdOrder.countDown();//將計數器的計數減1 
    36.             System.out.println("線程" + Thread.currentThread().getName() +  
    37.             "已發送命令,正在等待結果"); 
    38.             //主線程在等待另一個計數器(cdAnswer)爲0,當爲0時,開始向下執行。它(cdAnswer)的初始值爲3, 
    39.             
    40.      
           
           
           
      1. cdAnswer.await();  
    41.             System.out.println("線程" + Thread.currentThread().getName() +  
    42.             "已收到全部響應結果");    
    43.         } catch (Exception e) { 
    44.             e.printStackTrace(); 
    45.         }                
    46.         service.shutdown(); 
    47.     } 

上述CountdownLatch的代碼例子中,有兩個計數器ide

  
  
  
  
  1. final CountDownLatch cdOrder = new CountDownLatch(1); 

至關於在運動會上發佈信號的指揮員,指揮員一吹哨子,3個「運動員」(線程)開始執行。spa

  
  
  
  
  1. final CountDownLatch cdAnswer = new CountDownLatch(3); 

至關於公佈成績的裁判,每一個運動員到達終點時,給裁判一個信號,「我到了(至關於將計數器減1)」,當3個「運動員」(線程)都到達時,裁判纔會公佈成績,即線程

  
  
  
  
  1. cdAnswer.await();  

下面的代碼纔會執行。get

總結:CountDownLatch能夠實現「一我的」通知「多我的」的效果,也能夠實現多我的通知一我的的效果。string

相關文章
相關標籤/搜索