Java中的Semaphore計數(shù)信號量詳細(xì)解析
1.介紹
Semaphore 是一個計數(shù)信號量,必須由獲取它的線程釋放。
常用于限制可以訪問某些資源的線程數(shù)量,例如通過 Semaphore 限流。
2.具體方法
- acquire()
- 獲取一個令牌,在獲取到令牌、或者被其他線程調(diào)用中斷之前線程一直處于阻塞狀態(tài)。
- acquire(int permits)
- 獲取一個令牌,在獲取到令牌、或者被其他線程調(diào)用中斷、或超時之前線程一直處于阻塞狀態(tài)。
- acquireUninterruptibly()
- 獲取一個令牌,在獲取到令牌之前線程一直處于阻塞狀態(tài)(忽略中斷)。
- tryAcquire()
- 嘗試獲得令牌,返回獲取令牌成功或失敗,不阻塞線程。
- tryAcquire(long timeout, TimeUnit unit)
- 嘗試獲得令牌,在超時時間內(nèi)循環(huán)嘗試獲取,直到嘗試獲取成功或超時返回,不阻塞線程。
- release()
- 釋放一個令牌,喚醒一個獲取令牌不成功的阻塞線程。
- hasQueuedThreads()
- 等待隊列里是否還存在等待線程。
- getQueueLength()
- 獲取等待隊列里阻塞的線程數(shù)。
- drainPermits()
- 清空令牌把可用令牌數(shù)置為0,返回清空令牌的數(shù)量。
- availablePermits()
- 返回可用的令牌數(shù)量。
3.實現(xiàn)場景
模擬停車場停車,進(jìn)來一輛,指示牌減一,出去一輛,指示牌加一,當(dāng)指示牌顯示為0時,禁止車輛進(jìn)入。
public class Test_Semaphore {
//停車場同時容納的車輛10
private static Semaphore semaphore=new Semaphore(10);
public static void main(String[] args) {
//模擬50輛車進(jìn)入停車場
for(int i=0;i<50;i++){
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("===="+Thread.currentThread().getName()+"來到停車場");
if(semaphore.availablePermits()==0){
System.out.println("車位不足,請耐心等待");
}
semaphore.acquire();//獲取令牌嘗試進(jìn)入停車場
System.out.println(Thread.currentThread().getName()+"成功進(jìn)入停車場");
Thread.sleep(new Random().nextInt(10000));//模擬車輛在停車場停留的時間
System.out.println(Thread.currentThread().getName()+"駛出停車場");
semaphore.release();//釋放令牌,騰出停車場車位
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},i+"號車");
thread.start();
}
}
}
到此這篇關(guān)于Java中的Semaphore計數(shù)信號量詳細(xì)解析的文章就介紹到這了,更多相關(guān)Semaphore計數(shù)信號量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Volatile關(guān)鍵字實現(xiàn)原理過程解析
這篇文章主要介紹了Java Volatile關(guān)鍵字實現(xiàn)原理過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
創(chuàng)建動態(tài)代理對象bean,并動態(tài)注入到spring容器中的操作
這篇文章主要介紹了創(chuàng)建動態(tài)代理對象bean,并動態(tài)注入到spring容器中的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
Springboot整合Jedis實現(xiàn)單機(jī)版或哨兵版可切換配置方法
這篇文章主要介紹了Springboot整合Jedis實現(xiàn)單機(jī)版或哨兵版可切換配置方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-11-11
詳解MyBatis多數(shù)據(jù)源配置(讀寫分離)
這篇文章主要介紹了詳解MyBatis多數(shù)據(jù)源配置(讀寫分離),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
SpringBoot項目配置多數(shù)據(jù)源的兩種方式詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot項目配置多數(shù)據(jù)源的兩種方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2026-01-01
基于Java 數(shù)組內(nèi)存分配的相關(guān)問題
本篇文章是對Java中數(shù)組內(nèi)存分配進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Java基礎(chǔ)之詳解基本數(shù)據(jù)類型的使用
今天給大家?guī)淼氖顷P(guān)于Java基礎(chǔ)的相關(guān)知識,文章圍繞著基本數(shù)據(jù)類型的使用展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06

