CountDownLatch是什么
CountDownLatch是在java1.5被引入的,跟它一起被引入的并發工具類還有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它們都存在于java.util.concurrent包下。CountDownLatch這個類能夠使一個線程等待其他線程完成各自的工作后再執行。例如,應用程序的主線程希望在負責啟動框架服務的線程已經啟動所有的框架服務之后再執行。
CountDownLatch是通過一個計數器來實現的,計數器的初始值為線程的數量。每當一個線程完成了自己的任務后,計數器的值就會減1。當計數器值到達0時,它表示所有的線程已經完成了任務,然后在閉鎖上等待的線程就可以恢復執行任務。
我的理解
CountDownLatch 存在的意義
讓主線程阻塞,等待線程結束后在運行
直譯過來就是倒計數(CountDown)門閂(Latch)。倒計數不用說,門閂的意思顧名思義就是阻止前進。在這里就是指 CountDownLatch.await() 方法在倒計數為0之前會阻塞當前線程。
實現
CountDownLatch內部維護一個最大線程數,當每個線程執行結束,就調用
latch.countDown();
將數量減 1 ,當數量為0的時候,就放棄阻塞主線程,也就是放棄 countDownLatch.await()
阻塞的線程
代碼解釋
ExecutorService executors = Executors.newFixedThreadPool(pagecount);
CountDownLatch countDownLatch = new CountDownLatch(pagecount);
for (int i = 0; i < pagecount; i++) {
HttpGet httpget = new HttpGet(urisToGet[i]);
config(httpget);
// 啟動線程抓取
executors
.execute(new GetRunnable(urisToGet[i], countDownLatch));
}
countDownLatch.await();//主線程阻塞在這里,等到線程結束,
//然后關閉線程池
executors.shutdown();