Java並發之CountDownLatch工具類
一、CountDownLatch工具類介紹
CountDownLatch類是Java並發工具常用的四大工具之一,CountDownLatch允許一個或者多個線程等待其他線程完成工作。假設我們有這樣的一個需求,我們需要解析一個Excel裏多個sheet的據,這個時候我們考慮使用多 線程同時進行工作,每個線程解析一個sheet裏的數據,等到所有的sheet都解析完之後,程序需要提示解析完成將數據返回。在這個需求中,要實現主線程等待所有線程完成sheet的解析操作。在這種情況之下我們就可以考慮使用CountDownLatch工具類。
1 2 import java.util.concurrent.CountDownLatch; 34 public class CountDownLatchUserCase { 5 6 private static CountDownLatch countDownLatch = new CountDownLatch(5); 7 8 public static void main(String[] args) throws Exception{ 9 //主線程開始讀取Excel文檔 10 new Excel().start(); 11 long count = countDownLatch.getCount(); 12for(int i = 0;i < count;i++){ 13 new Sheet().start(); 14 } 15 } 16 17 static class Excel extends Thread{ 18 19 @Override 20 public void run(){ 21 try { 22 System.out.println("開始讀取Excel文檔,共有"+countDownLatch.getCount()+"個工人同時工作"); 23 countDownLatch.await(); 24 }catch (Exception e){ 25 e.printStackTrace(); 26 } 27 System.out.println("所有Excel文檔工作讀取完畢"); 28 } 29 } 30 31 static class Sheet extends Thread{ 32 33 @Override 34 public void run(){ 35 System.out.println(Thread.currentThread().getName() + ",完成sheet讀取工作...."); 36 //完成其中一個sheet的工作 count - 1 37 countDownLatch.countDown(); 38 } 39 40 } 41 42 } 43
1 開始讀取Excel文檔,共有5個工人同時工作 2 Thread-4,完成sheet讀取工作.... 3 Thread-2,完成sheet讀取工作.... 4 Thread-3,完成sheet讀取工作.... 5 Thread-1,完成sheet讀取工作.... 6 Thread-5,完成sheet讀取工作.... 7 所有Excel文檔工作讀取完畢
CountDownLatch是通過一個計數器來實現的,當我們在new 一個CountDownLatch對象的時候需要帶入該計數器值,該值就表示了線程的數量。每當一個線程完成自己的任務後,計數器的值就會減1。當計數器的值變為0時,就表示所有的線程均已經完成了任務,然後就可以恢復等待的線程繼續執行了。
CountDownLatch類只提供了一個構造器:
1 public CountDownLatch(int count) { }; //參數count為計數值
CountDownLatch類中提供了3個最重要的方法:
1 public void await() throws InterruptedException { }; //調用await()方法的線程會被掛起,它會等待直到count值為0才繼續執行 2 public boolean await(long timeout, TimeUnit unit) throws InterruptedException { }; //和await()類似,只不過等待一定的時間後count值還沒變為0的話就會繼續執行 3 public void countDown() { }; //將count值減1
二、CountDownLatch原理分析
CountDownLatch內部通過共享鎖實現。CountDownLatch的構造函數接收一個int類型的參數作為計數器,這個計數器的值也可以理解為該共享鎖可以獲取的總次數。如果你想等待N個點完 成,這裏就傳入N。當我們調用CountDownLatch的countDown方法時,N就會減1,當線程調用await方法的時候,程序首先判斷count的值是否為0,如果不會0的話則會阻塞當前線程一直等待直到為0為止。
註意:CountDownLatch不可能重新初始化或者修改CountDownLatch對象的內部計數 器的值。
CountDownLatch不能回滾重置。
Java並發之CountDownLatch工具類