Java?CountDownLatch線程同步源碼硬核解析
場景
有時間在主線程中開啟了多線程后,主線程需要等所有線程執(zhí)行完畢才能return,這個時候就需要在return前攔一下,直到所有線程執(zhí)行完畢。
或者,某些場景下需要多個線程同一時間執(zhí)行,需要在起步的時候統(tǒng)一攔一下,然后收到通知再運行。
java.util.concurrent.CountDownLatch就能實現(xiàn)我們上面的這些需求。
CountDownLatch
CountDownLatch是通過一個計數(shù)器來實現(xiàn)的,計數(shù)器的初始化值為線程的數(shù)量。每當(dāng)一個線程完成了自己的任務(wù)后,計數(shù)器的值就相應(yīng)得減1。當(dāng)計數(shù)器到達(dá)0時,表示所有的線程都已完成任務(wù),然后在閉鎖上等待的線程就可以恢復(fù)執(zhí)行任務(wù)
代碼demo
直接上demo把。
主線程等待多線程完成后返回
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é)果
讓所有線程同一時間執(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線程同步源碼硬核解析的文章就介紹到這了,更多相關(guān)Java CountDownLatch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PowerJobAutoConfiguration自動配置源碼流程解析
這篇文章主要為大家介紹了PowerJobAutoConfiguration自動配置源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12數(shù)據(jù)結(jié)構(gòu)與算法之并查集(不相交集合)
并查集是一種挺高效的數(shù)據(jù)結(jié)構(gòu)。實現(xiàn)簡單,只是所有元素統(tǒng)一遵從一個規(guī)律所以讓辦事情的效率高效起來。這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)與算法——并查集(不相交集合),需要的朋友可以參考下2019-11-11微信公眾號開發(fā)之設(shè)置自定義菜單實例代碼【java版】
這篇文章主要介紹了微信公眾號開發(fā)之設(shè)置自定義菜單實例代碼,本實例是為了實現(xiàn)在管理后臺實現(xiàn)微信菜單的添加刪除管理。需要的朋友可以參考下2018-06-06springBoot?@Scheduled實現(xiàn)多個任務(wù)同時開始執(zhí)行
這篇文章主要介紹了springBoot?@Scheduled實現(xiàn)多個任務(wù)同時開始執(zhí)行,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12mybatis分割字符串并循環(huán),實現(xiàn)in多個參數(shù)的操作
這篇文章主要介紹了mybatis分割字符串并循環(huán),實現(xiàn)in多個參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Java中為什么重寫equals()也需要重寫hashCode方法
這篇文章主要介紹了Java中為什么重寫equals()也需要重寫hashCode(),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04