1. CountDownLatch是什么
CountDownLatch是一個同步工具類,它允許一個或多個線程一直等待撵渡,直到其他線程的操作執(zhí)行完后再執(zhí)行
融柬,必要時可以對各個任務的執(zhí)行結(jié)果進行匯總,然后主線程才繼續(xù)往下執(zhí)行趋距。常被用在多線程環(huán)境下粒氧,它在初始時需要指定一個計數(shù)器的大小,然后可被多個線程并發(fā)的實現(xiàn)減 1 操作节腐,并在計數(shù)器為 0 后調(diào)用 await 方法的線程被喚醒外盯,從而實現(xiàn)多線程間的協(xié)作
2 適用場景
CountDownLatch非常適合于對任務進行拆分,使其并行執(zhí)行翼雀,比如某個任務執(zhí)行2s饱苟,其對數(shù)據(jù)的請求可以分為五個部分狼渊,那么就可以將這個任務拆分為5個子任務狈邑,分別交由五個線程執(zhí)行,執(zhí)行完成之后再由主線程進行匯總糕伐,此時蘸嘶,總的執(zhí)行時間將決定于執(zhí)行最慢的任務训唱,平均來看,還是大大減少了總的執(zhí)行時間遵岩。
另外一種比較合適使用CountDownLatch的地方是使用某些外部鏈接請求數(shù)據(jù)的時候,比如圖片宴凉。在本人所從事的項目中就有類似的情況表悬,因為我們使用的圖片服務只提供了獲取單個圖片的功能,而每次獲取圖片的時間不等籽暇,一般都需要1.5s~2s。當我們需要批量獲取圖片的時候熬荆,比如列表頁需要展示一系列的圖片绸狐,如果使用單個線程順序獲取,那么等待時間將會極長寒矿,此時我們就可以使用CountDownLatch對獲取圖片的操作進行拆分,并行的獲取圖片拆融,這樣也就縮短了總的獲取時間
3 原理
采用AQS實現(xiàn)啊终,參見https://www.infoq.cn/article/java8-abstractqueuedsynchronizer/
4 應用實列
static CountDownLatch c = new CountDownLatch(3);
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(1);
c.countDown();
System.out.println(2);
c.countDown();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(3);
c.countDown();
}
}).start();
c.await();
System.out.println("over");
}
調(diào)用一次CountDownLatch的countDown方法時孕索,N就會減1搞旭,CountDownLatch的await會阻塞當前線程,直到N變成零镇眷。由于countDown方法可以用在任何地方欠动,所以這里說的N個點具伍,可以是N個線程圈驼,也可以是1個線程里的N個執(zhí)行步驟绩脆。用在多個線程時橄抹,你只需要把這個CountDownLatch的引用傳遞到線程
5 總結(jié)
- CountDownLatch 可以用Thread.join 實現(xiàn)