CountDownLatch 之簡介.

CountDownLatch 類,我們從字面上看它的意思就是:向下計數的鎖。

首先,借用API的一段文字:

  

一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。

用給定的計數 初始化 CountDownLatch。由於調用了countDown() 方法,所以在當前計數到達零之前,await 方法會一直受阻塞。之後,會釋放所有等待的線程,await 的所有後續調用都將立即返回。這種現象只出現一次——計數無法被重置。如果需要重置計數,請考慮使用CyclicBarrier

CountDownLatch 是一個通用同步工具,它有很多用途。將計數 1 初始化的CountDownLatch 用作一個簡單的開/關鎖存器,或入口:在通過調用 countDown() 的線程打開入口前,所有調用await 的線程都一直在入口處等待。用 N 初始化的 CountDownLatch 可以使一個線程在 N 個線程完成某項操作之前一直等待,或者使其在某項操作完成 N 次之前一直等待。

CountDownLatch 的一個有用特性是,它不要求調用 countDown 方法的線程等到計數到達零時才繼續,而在所有線程都能通過之前,它只是阻止任何線程繼續通過一個 await

在使用該類事,主要用到三個方法:

   1.         CountDownLatch(int count)

    該類的構造方法,count爲初始的數字,也就是說向下計數的基。

 2.   await(long timeout,TimeUnit unit)或await()

    該方法在當前線程計數(count)到零之前,或者到達指定的等待時間(timeout),是處在阻塞狀態。

 3.   countDown()

      減數功能,調用一次,count就減一。

注意事項:  CountDownLatch 對象只能被實例一次,並且count減到零後,不可重置,實例化的CountDownLatch對象消失,它的其它方法也固然失效。   

  實例代碼:

 public class MSample {
    
    private final static CountDownLatch mCountDownLatch = new CountDownLatch(1);
 
     
     private static class Test1 extends Thread {
         
         @Override
         public void run() {
             System.out.println("Test1 started!");
             mCountDownLatch.countDown();
            System.out.println("Test1 end!"); 
         }
     }
     
    /**
      * 示例線程類
      */
     private static class Test2 extends Thread {
        
         @Override
         public void run() {
            System.out.println("Test2 started!");
            try {
                 
                mCountDownLatch.await();
            } catch (InterruptedException e) {
                
            }
             System.out.println("Test2 end!");
         }
     }
     
     public static void main(String[] args) throws Exception {
        
           new Test2 ().start();
new Test1 ().start(); }


Test2 started!
Test1 started!
Test2 end!
Test1 end!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章