多線程--CountDownLatch

(計數器)CountDownLatch

CountDownLatch類放在java.util.concurrent包下,利用它能夠實現相似的計數器的功能。相似有一個任務A,它要等待其餘4個任務執行完成以後才能執行,此時就能夠利用CountDownLatch來實現這種功能了。CountDownLatch是經過一個計數器來實現的,計數器的初始變量線程的數量。每當一個線程完成了本身的任務後,計數器的值就會減1。當計數器值到達0時,它表示全部的線程已經完成了任務,而後在閉鎖上等待的線程就能夠恢復執行任務。java

countDownLatch是在java1.5被約會,跟它一塊兒被約會的工具類還有CyclicBarrier,Semaphore,concurrentHashMap和BlockingQueue。存在於java.util.concurrent包下。app

 
 
  1. public class CountDownLatchExample {ide

  2.   // 循環次數工具

  3.  private static final int FOR_NUMBER = 5;spa



  4.   public static void main(String[] args) {線程


  5.       // 查詢數據3d

  6.       for (int i = 0; i < FOR_NUMBER; i++) {code

  7.           new Thread(() -> {orm

  8.               System.out.println("查詢第:\t" + Thread.currentThread().getName() + "張表數據完成!");blog

  9.          }, String.valueOf(i)).start();

  10.      }



  11.       System.out.println("查詢完畢");


  12.  }

  13. }

圖片能夠看到,還有數據沒查詢完成他就體檢進行查詢完成的操做了。那若是在實際開發過程當中,就等於數據還沒處理完成就返回用戶數據了。這並非咱們想要的結果。

那麼剛纔也有說CountDownLatch是多個一個或多個線程等待其餘線程完成操做,那麼咱們試一下。

 
 
  1. public class CountDownLatchExample {

  2.   // 循環五次

  3.  private static final int FOR_NUMBER = 5;


  4.  // 實例化定義一個CountDownLatch須要減小的總次數

  5.  private static CountDownLatch countDownLatch = new CountDownLatch(5);



  6.   public static void main(String[] args) {


  7.       // 查詢數據

  8.       for (int i = 0; i < FOR_NUMBER; i++) {

  9.           new Thread(() -> {

  10.               System.out.println("查詢第:\t" + Thread.currentThread().getName() + "張表數據完成!");


  11.               // 執行完 查詢 而後進行遞減操做 每次減1

  12.               countDownLatch.countDown();

  13.          }, String.valueOf(i)).start();

  14.      }


  15.       try {

  16.           countDownLatch.await(); // await()方法起到阻塞的做用,直到計數器值等於0

  17.      } catch (InterruptedException e) {

  18.           e.printStackTrace();

  19.      }



  20.       System.out.println("查詢完畢");


  21.  }

  22. }

圖片

突破實現:圖片

有參構造傳的是int類型數據

圖片

await方法: await()方法合併的做用,直到計數器值等於0才能走下面的邏輯

圖片

*若是新計數爲零,則全部等待線程都將從新啓用*線程調度目的。*若是當前計數等於零,則不會發生任何事情。countDown方法::若是當前計數大於零,則將其遞減。

圖片

getCount方法:返回當前計數

相關文章
相關標籤/搜索