java并發(fā)編程專題(八)----(JUC)實例講解CountDownLatch
CountDownLatch 是一個非常實用的多線程控制工具類?!?Count Down ” 在英文中意為倒計數(shù), Latch 為門問的意思。如果翻譯成為倒計數(shù)門閥, 我想大家都會覺得不知所云吧! 因此,這里簡單地稱之為倒計數(shù)器。在這里, 門問的含義是:把門鎖起來,不讓里面的線程跑出來。因此,這個工具通常用來控制線程等待,它可以讓某一個線程等待直到倒計時結(jié)束, 再開始執(zhí)行。
CountDown Latch 的構(gòu)造函數(shù)接收一個整數(shù)作為參數(shù),即當前這個計數(shù)器的計數(shù)個數(shù)。
public CountDownLatch(int count)
CountDownLatch是一個同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個或多個線程一直等待。一個CountDownLatch初始化為給定的計數(shù) 。 調(diào)用await方法阻塞,直到當前計數(shù)為零,在調(diào)用countDown()方法之后,所有等待的線程被釋放,任何后續(xù)調(diào)用await立即返回。 這是一次性的現(xiàn)象 - 計數(shù)不能重置。 如果需要重置計數(shù),考慮使用CyclicBarrier ,CyclicBarrier的計數(shù)器可以被重置后使用,因此它被稱為是循環(huán)的barrier。
主要方法:
// 使當前線程在鎖存器倒計數(shù)至零之前一直等待,除非線程被中斷。 void await() // 使當前線程在鎖存器倒計數(shù)至零之前一直等待,除非線程被中斷或超出了指定的等待時間。 boolean await(long timeout, TimeUnit unit) // 遞減鎖存器的計數(shù),如果計數(shù)到達零,則釋放所有等待的線程。 void countDown() // 返回當前計數(shù)。 long getCount()
我們來看一個例子:
public class TestCountDownLatch { private static final int RUNNER_NUMBER = 5; // 運動員個數(shù) private static final Random RANDOM = new Random(); public static void main(String[] args) { // 用于判斷發(fā)令之前運動員是否已經(jīng)完全進入準備狀態(tài),需要等待5個運動員,所以參數(shù)為5 CountDownLatch readyLatch = new CountDownLatch(RUNNER_NUMBER); // 用于判斷裁判是否已經(jīng)發(fā)令,只需要等待一個裁判,所以參數(shù)為1 CountDownLatch startLatch = new CountDownLatch(1); for (int i = 0; i < RUNNER_NUMBER; i++) { Thread t = new Thread(new Runner((i + 1) + "號運動員", readyLatch, startLatch)); t.start(); } try { readyLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } startLatch.countDown(); System.out.println("裁判:所有運動員準備完畢,開始..."); } static class Runner implements Runnable { private CountDownLatch readyLatch; private CountDownLatch startLatch; private String name; public Runner(String name, CountDownLatch readyLatch, CountDownLatch startLatch) { this.name = name; this.readyLatch = readyLatch; this.startLatch = startLatch; } public void run() { int readyTime = RANDOM.nextInt(1000); System.out.println(name + ":我需要" + readyTime + "秒時間準備."); try { Thread.sleep(readyTime); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + ":我已經(jīng)準備完畢."); readyLatch.countDown(); try { startLatch.await(); // 等待裁判發(fā)開始命令 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + ":開跑..."); } } }
打印結(jié)果:
1號運動員:我需要547秒時間準備.
2號運動員:我需要281秒時間準備.
4號運動員:我需要563秒時間準備.
5號運動員:我需要916秒時間準備.
3號運動員:我需要461秒時間準備.
2號運動員:我已經(jīng)準備完畢.
3號運動員:我已經(jīng)準備完畢.
1號運動員:我已經(jīng)準備完畢.
4號運動員:我已經(jīng)準備完畢.
5號運動員:我已經(jīng)準備完畢.
裁判:所有運動員準備完畢,開始...
3號運動員:開跑...
2號運動員:開跑...
1號運動員:開跑...
4號運動員:開跑...
5號運動員:開跑...Process finished with exit code 0
注意:計數(shù)器必須大于等于0,只是等于0時候,計數(shù)器就是零,調(diào)用await方法時不會阻塞當前線程。
以上就是java并發(fā)編程專題(八)----(JUC)實例講解CountDownLatch的詳細內(nèi)容,更多關(guān)于java juc CountDownLatch的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
@FeignClient?實現(xiàn)簡便http請求封裝方式
這篇文章主要介紹了@FeignClient?實現(xiàn)簡便http請求封裝方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03從零開始讓你的Spring?Boot項目跑在Linux服務(wù)器
這篇文章主要給大家介紹了如何從零開始讓你的Spring?Boot項目跑在Linux服務(wù)器的相關(guān)資料,由于springboot是內(nèi)嵌了tomcat,所以可以直接將項目打包上傳至服務(wù)器上,需要的朋友可以參考下2021-11-11SpringBoot集成tika實現(xiàn)word轉(zhuǎn)html的操作代碼
Tika是一個內(nèi)容分析工具,自帶全面的parser工具類,能解析基本所有常見格式的文件,得到文件的metadata,content等內(nèi)容,返回格式化信息,本文給大家介紹了SpringBoot集成tika實現(xiàn)word轉(zhuǎn)html的操作,需要的朋友可以參考下2024-06-06Spring Boot整合elasticsearch的詳細步驟
這篇文章主要介紹了Spring Boot整合elasticsearch的詳細步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04