Java多線程CountDownLatch的實(shí)現(xiàn)
介紹
CountDownLatch是一個(gè)同步輔助類,它允許一個(gè)或多個(gè)線程一直等待直到其他線程執(zhí)行完畢才開始執(zhí)行。
用給定的計(jì)數(shù)初始化CountDownLatch,其含義是要被等待執(zhí)行完的線程個(gè)數(shù)。
每次調(diào)用CountDown(),計(jì)數(shù)減1
主程序執(zhí)行到await()函數(shù)會(huì)阻塞等待線程的執(zhí)行,直到計(jì)數(shù)為0
場景
1:多線程讀取批量文件, 并且讀取完成之后匯總處理
2:多線程讀取Excel多個(gè)sheet,讀取完成之后獲取匯總獲取的結(jié)果
3:多個(gè)人一起一起來吃飯,主人等待客人到來,客人一個(gè)個(gè)從不同地方來到飯店,主人需要等到所有人都到來之后,才能開飯
4:汽車站,所有乘客都從不同的地方趕到汽車站,必須等到所有乘客都到了,汽車才會(huì)出發(fā),(如果設(shè)置了超時(shí)等待,那么當(dāng)某個(gè)時(shí)間點(diǎn)到了,汽車也出發(fā))
5: 百米賽跑,4名運(yùn)動(dòng)員選手到達(dá)場地等待裁判口令,裁判一聲口令,選手聽到后同時(shí)起跑,當(dāng)所有選手到達(dá)終點(diǎn),裁判進(jìn)行匯總排名
6: 4名選手進(jìn)行大眾投票,投票現(xiàn)場有500個(gè)票, 投票時(shí)間是30分鐘,500個(gè)票投完結(jié)束投票,或者投票時(shí)間到了也結(jié)束投票
作用:可以用來確保某些活動(dòng)直到其他活動(dòng)都完成后才繼續(xù)執(zhí)行。
CountDownLatch非常適合于對(duì)任務(wù)進(jìn)行拆分,使其并行執(zhí)行,比如某個(gè)任務(wù)執(zhí)行2s,其對(duì)數(shù)據(jù)的請求可以分為五個(gè)部分,那么就可以將這個(gè)任務(wù)拆分為5個(gè)子任務(wù),分別交由五個(gè)線程執(zhí)行,執(zhí)行完成之后再由主線程進(jìn)行匯總,此時(shí),總的執(zhí)行時(shí)間將決定于執(zhí)行最慢的任務(wù),平均來看,還是大大減少了總的執(zhí)行時(shí)間。
注意事項(xiàng):
- 使用CountDownLatch必須確保計(jì)數(shù)器數(shù)量與子線程數(shù)量一致,且countDown必須要執(zhí)行,否則出現(xiàn)計(jì)數(shù)器不為0,導(dǎo)致主線程一致等待的情況
- 在執(zhí)行任務(wù)的線程中,使用了try...finally結(jié)構(gòu),該結(jié)構(gòu)可以保證創(chuàng)建的線程發(fā)生異常時(shí)CountDownLatch.countDown()方法也會(huì)執(zhí)行,也就保證了主線程不會(huì)一直處于等待狀態(tài)。
案例(模擬乘客登機(jī)的場景)
? ? public static void main(String[] args) { ? ? ? ? CountDownLatchUtils.initialize("da1", 5); ? ? ? ? List<String> list=new CopyOnWriteArrayList<>(); ? ? ? ? ExecutorUtils.create(()->{ ? ? ? ? ? ? System.out.println("張三正在馬鞍山,準(zhǔn)備趕到南京坐飛機(jī),需要1小時(shí)的車程到機(jī)場"); ? ? ? ? ? ? SleepTools.second(4); ? ? ? ? ? ? list.add("張三"); ? ? ? ? ? ? CountDownLatchUtils.countDown("da1"); ? ? ? ? }); ? ? ? ? ExecutorUtils.create(()->{ ? ? ? ? ? ? System.out.println("李四正在徐州,準(zhǔn)備趕到南京坐飛機(jī),需要5小時(shí)的車程到機(jī)場"); ? ? ? ? ? ? SleepTools.second(15); ? ? ? ? ? ? list.add("李四"); ? ? ? ? ? ? CountDownLatchUtils.countDown("da1"); ? ? ? ? }); ? ? ? ? ExecutorUtils.create(()->{ ? ? ? ? ? ? System.out.println("王五正在蕪湖,準(zhǔn)備趕到南京坐飛機(jī),需要2小時(shí)的車程到機(jī)場"); ? ? ? ? ? ? SleepTools.second(9); ? ? ? ? ? ? list.add("王五"); ? ? ? ? ? ? CountDownLatchUtils.countDown("da1"); ? ? ? ? }); ? ? ? ? ExecutorUtils.create(()->{ ? ? ? ? ? ? //飛機(jī)起飛 ? ? ? ? ? ? CountDownLatchUtils.await("da1",10); ?//這里先模擬10秒 360秒=1小時(shí) ? ? ? ? ? ? System.out.println("南京祿口機(jī)場_機(jī)長啟動(dòng)飛機(jī)起飛"); ? ? ? ? ? ? //當(dāng)前航班已到乘客 ? ? ? ? ? ? System.out.println("當(dāng)前航班已到乘客"+list); ? ? ? ? }); ? ? }
以上代碼都是我封裝后的,主要是看邏輯就行了
張三正在馬鞍山,準(zhǔn)備趕到南京坐飛機(jī),需要1小時(shí)的車程到機(jī)場
李四正在徐州,準(zhǔn)備趕到南京坐飛機(jī),需要5小時(shí)的車程到機(jī)場
王五正在蕪湖,準(zhǔn)備趕到南京坐飛機(jī),需要2小時(shí)的車程到機(jī)場
南京祿口機(jī)場_機(jī)長啟動(dòng)飛機(jī)起飛
當(dāng)前航班已到乘客[張三, 王五]
到此這篇關(guān)于Java多線程CountDownLatch的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java多線程CountDownLatch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Web開發(fā)之基于Session的購物商店實(shí)現(xiàn)方法
這篇文章主要介紹了Java Web開發(fā)之基于Session的購物商店實(shí)現(xiàn)方法,涉及Java針對(duì)session的操作及數(shù)據(jù)庫操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10Java實(shí)現(xiàn)圖片與二進(jìn)制的互相轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖片與二進(jìn)制的互相轉(zhuǎn)換,將圖片轉(zhuǎn)二進(jìn)制再將二進(jìn)制轉(zhuǎn)成圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03MyBatis實(shí)現(xiàn)萬能Map和模糊查詢
本文主要介紹了MyBatis實(shí)現(xiàn)萬能Map和模糊查詢,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07Android中比較常見的Java super關(guān)鍵字
這篇文章主要為大家介紹了Android中比較常見的Java super關(guān)鍵字,具有一定的學(xué)習(xí)參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01Java+Spring+MySql環(huán)境中安裝和配置MyBatis的教程
這篇文章主要介紹了Java+Spring+MySql環(huán)境中安裝和配置MyBatis的教程,MyBatis一般被用來增強(qiáng)數(shù)據(jù)庫操作,文中對(duì)MyBatis的主配置文件有較為詳細(xì)的講解,需要的朋友可以參考下2016-04-04SpringBoot中使用Session共享實(shí)現(xiàn)分布式部署的示例代碼
這篇文章主要介紹了SpringBoot中使用Session共享實(shí)現(xiàn)分布式部署的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Java 使用Axis調(diào)用WebService的示例代碼
這篇文章主要介紹了Java 使用Axis調(diào)用WebService的示例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-09-09十分簡單易懂的Java應(yīng)用程序性能調(diào)優(yōu)技巧分享
這篇文章主要介紹了十分簡單易懂的Java性能調(diào)優(yōu)技巧分享,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11