Java?CountDownLatch線(xiàn)程同步源碼硬核解析
場(chǎng)景
有時(shí)間在主線(xiàn)程中開(kāi)啟了多線(xiàn)程后,主線(xiàn)程需要等所有線(xiàn)程執(zhí)行完畢才能return,這個(gè)時(shí)候就需要在return前攔一下,直到所有線(xiàn)程執(zhí)行完畢。
或者,某些場(chǎng)景下需要多個(gè)線(xiàn)程同一時(shí)間執(zhí)行,需要在起步的時(shí)候統(tǒng)一攔一下,然后收到通知再運(yùn)行。
java.util.concurrent.CountDownLatch就能實(shí)現(xiàn)我們上面的這些需求。
CountDownLatch
CountDownLatch是通過(guò)一個(gè)計(jì)數(shù)器來(lái)實(shí)現(xiàn)的,計(jì)數(shù)器的初始化值為線(xiàn)程的數(shù)量。每當(dāng)一個(gè)線(xiàn)程完成了自己的任務(wù)后,計(jì)數(shù)器的值就相應(yīng)得減1。當(dāng)計(jì)數(shù)器到達(dá)0時(shí),表示所有的線(xiàn)程都已完成任務(wù),然后在閉鎖上等待的線(xiàn)程就可以恢復(fù)執(zhí)行任務(wù)
代碼demo
直接上demo把。
主線(xiàn)程等待多線(xiàn)程完成后返回
CountDownLatch countDownLatch = new CountDownLatch(5); for (int i = 0; i < 5; i++) { new Thread(() -> { String name = Thread.currentThread().getName(); System.out.println(name + "等待5秒" + LocalDateTime.now()); try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println(name + "扣減1" + LocalDateTime.now()); countDownLatch.countDown(); }).start(); } try { countDownLatch.await(); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("finish");
執(zhí)行結(jié)果
讓所有線(xiàn)程同一時(shí)間執(zhí)行
CountDownLatch countDownLatch = new CountDownLatch(1); for (int i = 0; i < 5; i++) { new Thread(() -> { String name = Thread.currentThread().getName(); try { System.out.println(name + "準(zhǔn)備" + LocalDateTime.now()); countDownLatch.await(); System.out.println(name + "完成" + LocalDateTime.now()); } catch (InterruptedException e) { throw new RuntimeException(e); } }).start(); } try { Thread.sleep(5000); System.out.println("link start"); } catch (InterruptedException e) { throw new RuntimeException(e); } countDownLatch.countDown();
執(zhí)行結(jié)果
到此這篇關(guān)于Java CountDownLatch線(xiàn)程同步源碼硬核解析的文章就介紹到這了,更多相關(guān)Java CountDownLatch內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java使用CountDownLatch實(shí)現(xiàn)網(wǎng)絡(luò)同步請(qǐng)求的示例代碼
- Java CountDownLatch與CyclicBarrier及Semaphore使用教程
- Java之CountDownLatch原理全面解析
- Java CountDownLatch的源碼硬核解析
- java并發(fā)包工具CountDownLatch源碼分析
- java并發(fā)使用CountDownLatch在生產(chǎn)環(huán)境翻車(chē)剖析
- java線(xiàn)程并發(fā)控制同步工具CountDownLatch
- Java AQS中閉鎖CountDownLatch的使用
相關(guān)文章
PowerJobAutoConfiguration自動(dòng)配置源碼流程解析
這篇文章主要為大家介紹了PowerJobAutoConfiguration自動(dòng)配置源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12數(shù)據(jù)結(jié)構(gòu)與算法之并查集(不相交集合)
并查集是一種挺高效的數(shù)據(jù)結(jié)構(gòu)。實(shí)現(xiàn)簡(jiǎn)單,只是所有元素統(tǒng)一遵從一個(gè)規(guī)律所以讓辦事情的效率高效起來(lái)。這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)與算法——并查集(不相交集合),需要的朋友可以參考下2019-11-11微信公眾號(hào)開(kāi)發(fā)之設(shè)置自定義菜單實(shí)例代碼【java版】
這篇文章主要介紹了微信公眾號(hào)開(kāi)發(fā)之設(shè)置自定義菜單實(shí)例代碼,本實(shí)例是為了實(shí)現(xiàn)在管理后臺(tái)實(shí)現(xiàn)微信菜單的添加刪除管理。需要的朋友可以參考下2018-06-06springBoot?@Scheduled實(shí)現(xiàn)多個(gè)任務(wù)同時(shí)開(kāi)始執(zhí)行
這篇文章主要介紹了springBoot?@Scheduled實(shí)現(xiàn)多個(gè)任務(wù)同時(shí)開(kāi)始執(zhí)行,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12mybatis分割字符串并循環(huán),實(shí)現(xiàn)in多個(gè)參數(shù)的操作
這篇文章主要介紹了mybatis分割字符串并循環(huán),實(shí)現(xiàn)in多個(gè)參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06基于SpringBoot和Vue寫(xiě)一個(gè)2048小游戲
創(chuàng)建一個(gè)基于 Java Spring Boot 后端和 Vue 前端的 2048 游戲,可以按照以下步驟進(jìn)行,這個(gè)項(xiàng)目將包括后端(用來(lái)處理游戲邏輯)和前端(用來(lái)顯示游戲界面和與用戶(hù)交互),感興趣的小伙伴可以參考本文自己動(dòng)手嘗試一下2024-08-08Java中為什么重寫(xiě)equals()也需要重寫(xiě)hashCode方法
這篇文章主要介紹了Java中為什么重寫(xiě)equals()也需要重寫(xiě)hashCode(),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04