Java CountDownLatch與CyclicBarrier及Semaphore使用教程
CountDownLatch
CountDownLatch是一個(gè)倒數(shù)的計(jì)數(shù)器閥門,初始化時(shí)閥門關(guān)閉,指定計(jì)數(shù)的數(shù)量,當(dāng)數(shù)量倒數(shù)減到0時(shí)閥門打開,被阻塞線程被喚醒。
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
// 總數(shù)是6,必須要執(zhí)行任務(wù)的時(shí)候,再使用 !
CountDownLatch countDownLatch = new CountDownLatch(6);
for (int i = 1; i <=6 ; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+" Go out");
countDownLatch.countDown(); // 數(shù)量-1
},String.valueOf(i)).start();
}
countDownLatch.await(); // 等待計(jì)數(shù)器歸零,然后再向下執(zhí)行
System.out.println("Close Door");
}
}
原理
countDownLatch.countDown();//數(shù)量-1
countDownLatch.await();//等待
每次有線程調(diào)用 countDown() 數(shù)量-1,假設(shè)計(jì)數(shù)器變?yōu)?,countDownLatch.await() 就會(huì)被喚醒,繼續(xù)執(zhí)行!
CyclicBarrier
CyclicBarrier是一個(gè)可循環(huán)的屏障,它允許多個(gè)線程在執(zhí)行完相應(yīng)的操作后彼此等待共同到達(dá)一個(gè)point,等所有線程都到達(dá)后再繼續(xù)執(zhí)行。
CyclicBarrier也可以像CountDownLatch一樣適用于多個(gè)子任務(wù)并發(fā)執(zhí)行,當(dāng)所有子任務(wù)都執(zhí)行完后再繼續(xù)接下來的工作。
public class CyclicBarrierDemo {
public static void main(String[] args) {
// 召喚龍珠的線程
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
System.out.println("召喚神龍成功!");
});
for (int i = 1; i <=7 ; i++) {
final int temp = i;
// lambda能操作到 i 嗎
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"收集"+temp+"個(gè)龍珠");
try {
cyclicBarrier.await(); // 等待
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
Semaphore
Semaphore翻譯過來是信號(hào)量的意思,它的作用是控制多個(gè)線程對(duì)同一個(gè)資源的訪問線程數(shù)量。比如在停車場(chǎng)停車,里面有10個(gè)車位,當(dāng)這10個(gè)車位被停滿的時(shí)候其他的車只能等待(堵塞)里面有車駛出(release)然后再進(jìn)入。
public class SemaphoreDemo {
public static void main(String[] args) {
// 線程數(shù)量:停車位! 限流!
Semaphore semaphore = new Semaphore(3);
for (int i = 1; i <=6 ; i++) {
new Thread(()->{
// acquire() 得到
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"搶到車位");
TimeUnit.SECONDS.sleep(2);
System.out.println(Thread.currentThread().getName()+"離開車位");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // release() 釋放
}
},String.valueOf(i)).start();
}
}
}
semaphore.acquire();獲得,假設(shè)如果已經(jīng)滿了,等待,等待被釋放為止!
semaphore.release();釋放,會(huì)將當(dāng)前的信號(hào)量釋放 + 1,然后喚醒等待的線程!
作用: 多個(gè)共享資源互斥的使用!并發(fā)限流,控制最大的線程數(shù)!
到此這篇關(guān)于Java CountDownLatch與CyclicBarrier及Semaphore使用教程的文章就介紹到這了,更多相關(guān)Java CountDownLatch內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis中關(guān)于mapper的使用以及注意事項(xiàng)
這篇文章主要介紹了mybatis中關(guān)于mapper的使用以及注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
使用Swagger時(shí)Controller中api接口顯示不全的問題分析及解決
swagger是一個(gè)十分好用的api接口管理、測(cè)試框架,現(xiàn)在越來越多的人使用這個(gè)做接口的測(cè)試和管理,但經(jīng)常遇到Controller中的api接口顯示不全的問題,所以本文給大家詳細(xì)分析了問題以及解決方法,需要的朋友可以參考下2024-02-02
Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法詳解
這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法,在日常的開發(fā)工作中,我們時(shí)常會(huì)遇到導(dǎo)出Word文檔報(bào)表的需求,比如公司的財(cái)務(wù)報(bào)表、醫(yī)院的患者統(tǒng)計(jì)報(bào)表、電商平臺(tái)的銷售報(bào)表等等,需要的朋友可以參考下2023-08-08
springboot單元測(cè)試兩種方法實(shí)例詳解
這篇文章主要介紹了springboot單元測(cè)試兩種方法實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
淺談Java當(dāng)作數(shù)組的幾個(gè)應(yīng)用場(chǎng)景
數(shù)組可以存放多個(gè)同一類型的數(shù)據(jù),可以存儲(chǔ)基本數(shù)據(jù)類型,引用數(shù)據(jù)類型(對(duì)象),下面這篇文章主要給大家介紹了關(guān)于Java當(dāng)作數(shù)組的幾個(gè)應(yīng)用場(chǎng)景,需要的朋友可以參考下2022-11-11
SpringBoot?基于?MongoTemplate?的工具類過程詳解
MongoDB是一個(gè)高性能,開源,無模式的文檔型數(shù)據(jù)庫(kù),是當(dāng)前NoSql數(shù)據(jù)庫(kù)中比較熱門的一種,這篇文章主要介紹了SpringBoot基于MongoTemplate的工具類,需要的朋友可以參考下2023-09-09
Spring?Boot接口支持高并發(fā)具體實(shí)現(xiàn)代碼
這篇文章主要給大家介紹了關(guān)于Spring?Boot接口支持高并發(fā)具體實(shí)現(xiàn)的相關(guān)資料,在SpringBoot項(xiàng)目中通常我們沒有處理并發(fā)問題,但是使用項(xiàng)目本身還是支持一定的并發(fā)量,需要的朋友可以參考下2023-08-08
關(guān)于spring事務(wù)傳播行為非事務(wù)方式的理解
這篇文章主要介紹了對(duì)spring事務(wù)傳播行為非事務(wù)方式的全面理解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11

