java并發(fā)編程專題(八)----(JUC)實(shí)例講解CountDownLatch
CountDownLatch 是一個(gè)非常實(shí)用的多線程控制工具類。” Count Down ” 在英文中意為倒計(jì)數(shù), Latch 為門問的意思。如果翻譯成為倒計(jì)數(shù)門閥, 我想大家都會(huì)覺得不知所云吧! 因此,這里簡單地稱之為倒計(jì)數(shù)器。在這里, 門問的含義是:把門鎖起來,不讓里面的線程跑出來。因此,這個(gè)工具通常用來控制線程等待,它可以讓某一個(gè)線程等待直到倒計(jì)時(shí)結(jié)束, 再開始執(zhí)行。
CountDown Latch 的構(gòu)造函數(shù)接收一個(gè)整數(shù)作為參數(shù),即當(dāng)前這個(gè)計(jì)數(shù)器的計(jì)數(shù)個(gè)數(shù)。
public CountDownLatch(int count)
CountDownLatch是一個(gè)同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個(gè)或多個(gè)線程一直等待。一個(gè)CountDownLatch初始化為給定的計(jì)數(shù) 。 調(diào)用await方法阻塞,直到當(dāng)前計(jì)數(shù)為零,在調(diào)用countDown()方法之后,所有等待的線程被釋放,任何后續(xù)調(diào)用await立即返回。 這是一次性的現(xiàn)象 - 計(jì)數(shù)不能重置。 如果需要重置計(jì)數(shù),考慮使用CyclicBarrier ,CyclicBarrier的計(jì)數(shù)器可以被重置后使用,因此它被稱為是循環(huán)的barrier。
主要方法:
// 使當(dāng)前線程在鎖存器倒計(jì)數(shù)至零之前一直等待,除非線程被中斷。 void await() // 使當(dāng)前線程在鎖存器倒計(jì)數(shù)至零之前一直等待,除非線程被中斷或超出了指定的等待時(shí)間。 boolean await(long timeout, TimeUnit unit) // 遞減鎖存器的計(jì)數(shù),如果計(jì)數(shù)到達(dá)零,則釋放所有等待的線程。 void countDown() // 返回當(dāng)前計(jì)數(shù)。 long getCount()
我們來看一個(gè)例子:
public class TestCountDownLatch {
private static final int RUNNER_NUMBER = 5; // 運(yùn)動(dòng)員個(gè)數(shù)
private static final Random RANDOM = new Random();
public static void main(String[] args) {
// 用于判斷發(fā)令之前運(yùn)動(dòng)員是否已經(jīng)完全進(jìn)入準(zhǔn)備狀態(tài),需要等待5個(gè)運(yùn)動(dòng)員,所以參數(shù)為5
CountDownLatch readyLatch = new CountDownLatch(RUNNER_NUMBER);
// 用于判斷裁判是否已經(jīng)發(fā)令,只需要等待一個(gè)裁判,所以參數(shù)為1
CountDownLatch startLatch = new CountDownLatch(1);
for (int i = 0; i < RUNNER_NUMBER; i++) {
Thread t = new Thread(new Runner((i + 1) + "號(hào)運(yùn)動(dòng)員", readyLatch, startLatch));
t.start();
}
try {
readyLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
startLatch.countDown();
System.out.println("裁判:所有運(yùn)動(dòng)員準(zhǔn)備完畢,開始...");
}
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 + "秒時(shí)間準(zhǔn)備.");
try {
Thread.sleep(readyTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + ":我已經(jīng)準(zhǔn)備完畢.");
readyLatch.countDown();
try {
startLatch.await(); // 等待裁判發(fā)開始命令
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + ":開跑...");
}
}
}
打印結(jié)果:
1號(hào)運(yùn)動(dòng)員:我需要547秒時(shí)間準(zhǔn)備.
2號(hào)運(yùn)動(dòng)員:我需要281秒時(shí)間準(zhǔn)備.
4號(hào)運(yùn)動(dòng)員:我需要563秒時(shí)間準(zhǔn)備.
5號(hào)運(yùn)動(dòng)員:我需要916秒時(shí)間準(zhǔn)備.
3號(hào)運(yùn)動(dòng)員:我需要461秒時(shí)間準(zhǔn)備.
2號(hào)運(yùn)動(dòng)員:我已經(jīng)準(zhǔn)備完畢.
3號(hào)運(yùn)動(dòng)員:我已經(jīng)準(zhǔn)備完畢.
1號(hào)運(yùn)動(dòng)員:我已經(jīng)準(zhǔn)備完畢.
4號(hào)運(yùn)動(dòng)員:我已經(jīng)準(zhǔn)備完畢.
5號(hào)運(yùn)動(dòng)員:我已經(jīng)準(zhǔn)備完畢.
裁判:所有運(yùn)動(dòng)員準(zhǔn)備完畢,開始...
3號(hào)運(yùn)動(dòng)員:開跑...
2號(hào)運(yùn)動(dòng)員:開跑...
1號(hào)運(yùn)動(dòng)員:開跑...
4號(hào)運(yùn)動(dòng)員:開跑...
5號(hào)運(yùn)動(dòng)員:開跑...Process finished with exit code 0
注意:計(jì)數(shù)器必須大于等于0,只是等于0時(shí)候,計(jì)數(shù)器就是零,調(diào)用await方法時(shí)不會(huì)阻塞當(dāng)前線程。
以上就是java并發(fā)編程專題(八)----(JUC)實(shí)例講解CountDownLatch的詳細(xì)內(nèi)容,更多關(guān)于java juc CountDownLatch的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
手把手教你設(shè)置IntelliJ IDEA 的彩色代碼主題的圖文教程
本文給出一系列 IntelliJ IDEA 代碼的彩色主題,感興趣的朋友一起看看吧2018-01-01
jdk8的datetime時(shí)間函數(shù)使用示例
這篇文章主要介紹了jdk8的datetime時(shí)間函數(shù)使用示例,需要的朋友可以參考下2014-03-03
Java實(shí)現(xiàn)動(dòng)態(tài)日歷效果
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)動(dòng)態(tài)日歷效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
詳解Spring Security 中的四種權(quán)限控制方式
這篇文章主要介紹了詳解Spring Security 中的四種權(quán)限控制方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Spring Boot中自動(dòng)執(zhí)行sql腳本的實(shí)現(xiàn)
這篇文章主要介紹了Spring Boot中自動(dòng)執(zhí)行sql腳本的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
SpringBoot特點(diǎn)之依賴管理和自動(dòng)裝配(實(shí)例代碼)
在使用SpringBoot的時(shí)候,會(huì)自動(dòng)將Bean裝配到IoC容器中,操作也很簡單,今天小編給大家介紹下SpringBoot特點(diǎn)之依賴管理和自動(dòng)裝配的知識(shí),感興趣的朋友一起看看吧2022-03-03
Java的Tomcat和Servlet的運(yùn)行原理詳解
這篇文章主要為大家詳細(xì)介紹了Java的Tomcat和Servlet,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
使用SpringBoot配置多數(shù)據(jù)源的經(jīng)驗(yàn)分享
這篇文章主要介紹了使用SpringBoot配置多數(shù)據(jù)源的經(jīng)驗(yàn)分享,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04

