Java中的CountDownLatch簡(jiǎn)單理解
一、什么是CountDownLatch
CountDownLatch是一個(gè)同步工具類,用來攜調(diào)多個(gè)線程之間的同步,它是是使用一個(gè)計(jì)數(shù)器進(jìn)行實(shí)現(xiàn)的,計(jì)數(shù)器初始值為線程數(shù)量。
當(dāng)每一個(gè)線程完成自己任務(wù)后,計(jì)數(shù)器的值就會(huì)減1。
當(dāng)計(jì)數(shù)器的值為0時(shí),表示所有的線程都已經(jīng)完成一些任務(wù),然后再CountDownLatch上等待的線程就可以恢復(fù)執(zhí)行下來的任務(wù)。
二、哪些場(chǎng)景使用CountDownLatch
使用場(chǎng)景
- 某個(gè)線程需要在其他n個(gè)線程執(zhí)行完畢后再往下執(zhí)行。將CountDownLatch的計(jì)算器初始化化為new CountDownLatch(n),每當(dāng)一個(gè)線程任務(wù)執(zhí)行完畢,就將計(jì)數(shù)器減一(countDownLatch.countDown()),當(dāng)計(jì)數(shù)器變?yōu)?的時(shí)候,在CountDownLatch上的線程就會(huì)被喚醒 。比如,啟動(dòng)一個(gè)服務(wù)時(shí),主線程要等待多個(gè)組件加載完畢,之后在繼續(xù)執(zhí)行。
- 多個(gè)線程并行執(zhí)行同一個(gè)任務(wù),提高響應(yīng)速度。注意時(shí)并行,不是并發(fā),強(qiáng)調(diào)的是多個(gè)線程在某一時(shí)刻同時(shí)開始執(zhí)行。類似于賽跑,將多個(gè)線程放到起點(diǎn),等待起跑,然后同時(shí)開跑。做法是初始化一個(gè)共享的CountDownLatch(1),將其計(jì)數(shù)器初始化為1,多個(gè)線程在開始執(zhí)行任務(wù)前首先countDownLatch.await(),當(dāng)主線程調(diào)用countDown()時(shí),計(jì)數(shù)器為0,多個(gè)線程同時(shí)被喚醒。
三、CountDownLatch常用的方法
- new CountDownLatch(int count):count為計(jì)數(shù)器的初始值(一般需要多少個(gè)先吃執(zhí)行,count就設(shè)置為幾)
- countDown():每調(diào)用一次計(jì)數(shù)器值-1,直到count被減為0,代表所有線程全部執(zhí)行完畢。
- getCount():獲取當(dāng)前的計(jì)數(shù)器值。
- await():等待計(jì)數(shù)器變?yōu)?,即等待所有的異步線程執(zhí)行完畢
- boolean await(long timeout,TimeUnit unit):此方法至多會(huì)等待指定的時(shí)間,然后超時(shí)會(huì)自動(dòng)喚醒,若timeout小于等于0,則不會(huì)等待。當(dāng)計(jì)數(shù)器變?yōu)?,則返回true。若指定的等待時(shí)間過去了,則返回false。
四、CountDownLatch使用案例
線程池+CountDownLatch
public class Test {
public static void main(String[] args) throws InterruptedException {
//當(dāng)前執(zhí)行的線程數(shù)量
Integer poolNum = 10;
long start = System.currentTimeMillis();
//初始化線程運(yùn)行的數(shù)量
CountDownLatch countDownLatch = new CountDownLatch(poolNum);
Map<Integer,Integer> map = new HashMap<>();
for (int i = 1; i <= poolNum; i++) {
//耗時(shí)
Integer time = i*1000;
ThreadPoolUtils.execute(()->{
try {
//假設(shè)邏輯執(zhí)行的耗時(shí)
Thread.sleep(time);
map.put(time,time);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
countDownLatch.countDown();
}
});
}
countDownLatch.await();
System.out.println("總耗時(shí):"+(System.currentTimeMillis()-start));
for (Integer key: map.keySet()){
//打印出來的key值是沒有順序的,因?yàn)楦?jìng)爭(zhēng)的CPU資源不一樣
System.out.println("map的key為:"+key+" map的值為:"+ map.get(key));
}
}
}到此這篇關(guān)于Java中的CountDownLatch簡(jiǎn)單理解的文章就介紹到這了,更多相關(guān)CountDownLatch簡(jiǎn)單理解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot集成Swagger2項(xiàng)目實(shí)戰(zhàn)
在日常的工作中,我們往往需要給前端(WEB端、IOS、Android)或者第三方提供接口,這個(gè)時(shí)候我們就需要給他們提供一份詳細(xì)的API說明文檔。這篇文章我們就來分享一種API文檔維護(hù)的方式,即通過Swagger來自動(dòng)生成Restuful API文檔2018-01-01
關(guān)于Assert.assertEquals報(bào)錯(cuò)的問題及解決
這篇文章主要介紹了關(guān)于Assert.assertEquals報(bào)錯(cuò)的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
SpringMvc+POI處理excel表數(shù)據(jù)導(dǎo)入
這篇文章主要為大家詳細(xì)介紹了SpringMvc+POI處理excel表數(shù)據(jù)導(dǎo)入,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06

