Java CountDownLatch與CyclicBarrier及Semaphore使用教程
CountDownLatch
CountDownLatch是一個倒數(shù)的計數(shù)器閥門,初始化時閥門關(guān)閉,指定計數(shù)的數(shù)量,當數(shù)量倒數(shù)減到0時閥門打開,被阻塞線程被喚醒。
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
// 總數(shù)是6,必須要執(zhí)行任務(wù)的時候,再使用 !
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(); // 等待計數(shù)器歸零,然后再向下執(zhí)行
System.out.println("Close Door");
}
}
原理
countDownLatch.countDown();//數(shù)量-1
countDownLatch.await();//等待
每次有線程調(diào)用 countDown() 數(shù)量-1,假設(shè)計數(shù)器變?yōu)?,countDownLatch.await() 就會被喚醒,繼續(xù)執(zhí)行!
CyclicBarrier
CyclicBarrier是一個可循環(huán)的屏障,它允許多個線程在執(zhí)行完相應(yīng)的操作后彼此等待共同到達一個point,等所有線程都到達后再繼續(xù)執(zhí)行。
CyclicBarrier也可以像CountDownLatch一樣適用于多個子任務(wù)并發(fā)執(zhí)行,當所有子任務(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+"個龍珠");
try {
cyclicBarrier.await(); // 等待
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
Semaphore
Semaphore翻譯過來是信號量的意思,它的作用是控制多個線程對同一個資源的訪問線程數(shù)量。比如在停車場停車,里面有10個車位,當這10個車位被停滿的時候其他的車只能等待(堵塞)里面有車駛出(release)然后再進入。
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();釋放,會將當前的信號量釋放 + 1,然后喚醒等待的線程!
作用: 多個共享資源互斥的使用!并發(fā)限流,控制最大的線程數(shù)!
到此這篇關(guān)于Java CountDownLatch與CyclicBarrier及Semaphore使用教程的文章就介紹到這了,更多相關(guān)Java CountDownLatch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis中關(guān)于mapper的使用以及注意事項
這篇文章主要介紹了mybatis中關(guān)于mapper的使用以及注意事項,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
使用Swagger時Controller中api接口顯示不全的問題分析及解決
swagger是一個十分好用的api接口管理、測試框架,現(xiàn)在越來越多的人使用這個做接口的測試和管理,但經(jīng)常遇到Controller中的api接口顯示不全的問題,所以本文給大家詳細分析了問題以及解決方法,需要的朋友可以參考下2024-02-02
SpringBoot?基于?MongoTemplate?的工具類過程詳解
MongoDB是一個高性能,開源,無模式的文檔型數(shù)據(jù)庫,是當前NoSql數(shù)據(jù)庫中比較熱門的一種,這篇文章主要介紹了SpringBoot基于MongoTemplate的工具類,需要的朋友可以參考下2023-09-09
Spring?Boot接口支持高并發(fā)具體實現(xiàn)代碼
這篇文章主要給大家介紹了關(guān)于Spring?Boot接口支持高并發(fā)具體實現(xiàn)的相關(guān)資料,在SpringBoot項目中通常我們沒有處理并發(fā)問題,但是使用項目本身還是支持一定的并發(fā)量,需要的朋友可以參考下2023-08-08
關(guān)于spring事務(wù)傳播行為非事務(wù)方式的理解
這篇文章主要介紹了對spring事務(wù)傳播行為非事務(wù)方式的全面理解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11

