Java中的CountDownLatch簡單理解
一、什么是CountDownLatch
CountDownLatch是一個同步工具類,用來攜調(diào)多個線程之間的同步,它是是使用一個計數(shù)器進行實現(xiàn)的,計數(shù)器初始值為線程數(shù)量。
當每一個線程完成自己任務后,計數(shù)器的值就會減1。
當計數(shù)器的值為0時,表示所有的線程都已經(jīng)完成一些任務,然后再CountDownLatch上等待的線程就可以恢復執(zhí)行下來的任務。
二、哪些場景使用CountDownLatch
使用場景
- 某個線程需要在其他n個線程執(zhí)行完畢后再往下執(zhí)行。將CountDownLatch的計算器初始化化為new CountDownLatch(n),每當一個線程任務執(zhí)行完畢,就將計數(shù)器減一(countDownLatch.countDown()),當計數(shù)器變?yōu)?的時候,在CountDownLatch上的線程就會被喚醒 。比如,啟動一個服務時,主線程要等待多個組件加載完畢,之后在繼續(xù)執(zhí)行。
- 多個線程并行執(zhí)行同一個任務,提高響應速度。注意時并行,不是并發(fā),強調(diào)的是多個線程在某一時刻同時開始執(zhí)行。類似于賽跑,將多個線程放到起點,等待起跑,然后同時開跑。做法是初始化一個共享的CountDownLatch(1),將其計數(shù)器初始化為1,多個線程在開始執(zhí)行任務前首先countDownLatch.await(),當主線程調(diào)用countDown()時,計數(shù)器為0,多個線程同時被喚醒。
三、CountDownLatch常用的方法
- new CountDownLatch(int count):count為計數(shù)器的初始值(一般需要多少個先吃執(zhí)行,count就設置為幾)
- countDown():每調(diào)用一次計數(shù)器值-1,直到count被減為0,代表所有線程全部執(zhí)行完畢。
- getCount():獲取當前的計數(shù)器值。
- await():等待計數(shù)器變?yōu)?,即等待所有的異步線程執(zhí)行完畢
- boolean await(long timeout,TimeUnit unit):此方法至多會等待指定的時間,然后超時會自動喚醒,若timeout小于等于0,則不會等待。當計數(shù)器變?yōu)?,則返回true。若指定的等待時間過去了,則返回false。
四、CountDownLatch使用案例
線程池+CountDownLatch
public class Test {
public static void main(String[] args) throws InterruptedException {
//當前執(zhí)行的線程數(shù)量
Integer poolNum = 10;
long start = System.currentTimeMillis();
//初始化線程運行的數(shù)量
CountDownLatch countDownLatch = new CountDownLatch(poolNum);
Map<Integer,Integer> map = new HashMap<>();
for (int i = 1; i <= poolNum; i++) {
//耗時
Integer time = i*1000;
ThreadPoolUtils.execute(()->{
try {
//假設邏輯執(zhí)行的耗時
Thread.sleep(time);
map.put(time,time);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
countDownLatch.countDown();
}
});
}
countDownLatch.await();
System.out.println("總耗時:"+(System.currentTimeMillis()-start));
for (Integer key: map.keySet()){
//打印出來的key值是沒有順序的,因為競爭的CPU資源不一樣
System.out.println("map的key為:"+key+" map的值為:"+ map.get(key));
}
}
}到此這篇關于Java中的CountDownLatch簡單理解的文章就介紹到這了,更多相關CountDownLatch簡單理解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中的ScheduledThreadPoolExecutor定時任務詳解
這篇文章主要介紹了Java中的ScheduledThreadPoolExecutor詳解,??ScheduledThreadPoolExecutor?繼承自?ThreadPoolExecutor,它主要用來在給定的延遲之后運行任務,或者定期執(zhí)行任務,ScheduledThreadPoolExecutor?的功能與?Timer?類似<BR>,需要的朋友可以參考下2023-12-12
Reactor3 Map與FlatMap的區(qū)別示例詳解
這篇文章主要為大家介紹了Reactor3 Map與FlatMap的區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
springboot3生成本地文件url的實現(xiàn)示例
本文主要介紹了springboot3生成本地文件url的實現(xiàn)示例,從而提供一種高效的文件管理方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-01-01
SpringBoot如何接收前端傳來的json數(shù)據(jù)
這篇文章主要介紹了SpringBoot如何接收前端傳來的json數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
Java實現(xiàn)DelayQueue延遲隊列示例代碼
Java中的DelayQueue是一個特殊的隊列,它只允許在指定的延遲時間之后才能從隊列中取出元素,這篇文章主要給大家介紹了關于Java實現(xiàn)DelayQueue延遲隊列的相關資料,需要的朋友可以參考下2025-07-07

