CountDownLatch是什么
CountDownLatch是在java1.5被引入的,跟它一起被引入的并發(fā)工具類還有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它們都存在于java.util.concurrent包下。CountDownLatch這個(gè)類能夠使一個(gè)線程等待其他線程完成各自的工作后再執(zhí)行沉桌。例如,應(yīng)用程序的主線程希望在負(fù)責(zé)啟動框架服務(wù)的線程已經(jīng)啟動所有的框架服務(wù)之后再執(zhí)行算吩。
CountDownLatch是通過一個(gè)計(jì)數(shù)器來實(shí)現(xiàn)的留凭,計(jì)數(shù)器的初始值為線程的數(shù)量。每當(dāng)一個(gè)線程完成了自己的任務(wù)后偎巢,計(jì)數(shù)器的值就會減1蔼夜。當(dāng)計(jì)數(shù)器值到達(dá)0時(shí),它表示所有的線程已經(jīng)完成了任務(wù)压昼,然后在閉鎖上等待的線程就可以恢復(fù)執(zhí)行任務(wù)求冷。
我的理解
CountDownLatch 存在的意義
讓主線程阻塞瘤运,等待線程結(jié)束后在運(yùn)行
直譯過來就是倒計(jì)數(shù)(CountDown)門閂(Latch)。倒計(jì)數(shù)不用說匠题,門閂的意思顧名思義就是阻止前進(jìn)拯坟。在這里就是指 CountDownLatch.await() 方法在倒計(jì)數(shù)為0之前會阻塞當(dāng)前線程。
實(shí)現(xiàn)
CountDownLatch內(nèi)部維護(hù)一個(gè)最大線程數(shù)韭山,當(dāng)每個(gè)線程執(zhí)行結(jié)束郁季,就調(diào)用
latch.countDown();
將數(shù)量減 1 ,當(dāng)數(shù)量為0的時(shí)候,就放棄阻塞主線程钱磅,也就是放棄 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();//主線程阻塞在這里梦裂,等到線程結(jié)束,
//然后關(guān)閉線程池
executors.shutdown();