Java并發(fā)編程之工具類Semaphore的使用
一、Semaphore的理解
- Semaphore屬于java.util.concurrent包;
- Semaphore翻譯成字面意思為信號量,Semaphore可以控制同時訪問的線程個數(shù),通過acquire()獲取一個許可,如果沒有就等待,而release()釋放一個許可。
二、Semaphore類中常用方法

- public void acquire() 用來獲取一個許可,若無許可能夠獲得,則會一直等待,直到獲得許可。
- public void acquire(int permits) 獲取permits個許可。
- public void release() 釋放許可。注意,在釋放許可之前,必須先獲得許可。
- public void release(int permits) 釋放permits個許可。
- 注:以上4個方法都會被阻塞,如果想立即得到執(zhí)行結(jié)果,可以使用下面幾個方法。
- public boolean tryAcquire() 嘗試獲取一個許可,若獲取成功,則立即放回true,若獲取失敗,則立即返回false
- public boolean tryAcquire(long timeout, TimeUnit unit) 嘗試獲取一個許可,若在指定的時間內(nèi)獲取成功,則立即放回true。否則立即返回false
- public boolean tryAcquire(int permits) 嘗試獲取permits個許可。若獲取成功,則立即放回true,,若獲取失敗,則立即返回false。
- public boolean tryAcquire(int permits, long timeout, TimeUnit unit)嘗試獲取permits個許可。若在指定的時間內(nèi)獲取成功,則立即返回true,否則則立即返回false。
- 還可以通過availablePermits()方法得到可用的許可數(shù)目。
三、Semaphore類的使用示例
使用場景:
停車場容納總停車量5,
停車場剩余車位不足時,車輛只能在外面等待。
每有一輛車駛出停車場后,顯示牌的剩余車位數(shù)響應(yīng)的加1。
當一輛車進入停車場后,顯示牌的剩余車位數(shù)響應(yīng)的減1.
1.代碼
package com.xz.thread.Semaphore;
import java.util.Random;
import java.util.concurrent.Semaphore;
/**
* @description: 停車場容納總停車量5,
* 停車場剩余車位不足時,車輛只能在外面等待。
* 每有一輛車駛出停車場后,顯示牌的剩余車位數(shù)響應(yīng)的加1。
* 當一輛車進入停車場后,顯示牌的剩余車位數(shù)響應(yīng)的減1.
* @author: xz
* @create: 2021-05-31 21:03
*/
public class Demo {
//停車場停車方法
public void stopCar(Semaphore semaphore){
System.out.println(Thread.currentThread().getName()+" 來到停車場。");
if(semaphore.availablePermits()==0){
System.out.println("車位不足,請耐心等待。。。。");
}
//獲取令牌嘗試進入停車場
try {
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" 成功進入停車場。");
//模擬車輛在停車場停留的時間
try {
Thread.sleep(new Random().nextInt(5000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" 駛出停車場。");
//釋放令牌,騰出停車場車位
semaphore.release();
}
public static void main(String[] args) {
Demo d=new Demo();
//停車場同時容納的車輛5
Semaphore semaphore = new Semaphore(5);
//模擬10輛車進入停車場
for(int i=1;i<=10;i++){
new Thread(new Runnable() {
@Override
public void run() {
d.stopCar(semaphore);
}
},i+"號車").start();
}
}
}
2.運行main函數(shù),輸出結(jié)果如下:
1號車 來到停車場。
3號車 來到停車場。
3號車 成功進入停車場。
7號車 來到停車場。
1號車 成功進入停車場。
7號車 成功進入停車場。
2號車 來到停車場。
2號車 成功進入停車場。
8號車 來到停車場。
8號車 成功進入停車場。
4號車 來到停車場。
車位不足,請耐心等待。。。。
6號車 來到停車場。
車位不足,請耐心等待。。。。
5號車 來到停車場。
車位不足,請耐心等待。。。。
9號車 來到停車場。
車位不足,請耐心等待。。。。
10號車 來到停車場。
車位不足,請耐心等待。。。。
8號車 駛出停車場。
4號車 成功進入停車場。
4號車 駛出停車場。
6號車 成功進入停車場。
3號車 駛出停車場。
5號車 成功進入停車場。
1號車 駛出停車場。
9號車 成功進入停車場。
7號車 駛出停車場。
10號車 成功進入停車場。
2號車 駛出停車場。
6號車 駛出停車場。
10號車 駛出停車場。
5號車 駛出停車場。
9號車 駛出停車場。
Process finished with exit code 0。
到此這篇關(guān)于Java多線程之并發(fā)工具類Semaphore的使用的文章就介紹到這了,更多相關(guān)Java工具類Semaphore內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序微信登錄的實現(xiàn)方法詳解(JAVA后臺)
通常我們在登錄微信小程序的時候都是通過授權(quán)登錄,下面這篇文章主要給大家介紹了關(guān)于微信小程序微信登錄的實現(xiàn)方法,文中通過實例代碼介紹的介紹的非常詳細,需要的朋友可以參考下2022-07-07
Springboot 2.x中server.servlet.context-path的運用詳解
這篇文章主要介紹了Springboot 2.x中server.servlet.context-path的運用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01
SpringCloud之熔斷監(jiān)控Hystrix Dashboard的實現(xiàn)
這篇文章主要介紹了SpringCloud之熔斷監(jiān)控Hystrix Dashboard的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09
mybatis 獲取無數(shù)據(jù)的字段不顯示的問題
這篇文章主要介紹了mybatis 獲取無數(shù)據(jù)的字段不顯示的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
try catch finally的執(zhí)行順序深入分析
首先執(zhí)行try,如果有異常執(zhí)行catch,無論如何都會執(zhí)行finally,當有return以后,函數(shù)就會把這個數(shù)據(jù)存儲在某個位置,然后告訴主函數(shù),我不執(zhí)行了,接下來你執(zhí)行吧,所以函數(shù)就會推出2013-09-09
Java觀察者設(shè)計模式(Observable和Observer)
這篇文章主要介紹了 Java觀察者設(shè)計模式(Observable和Observer)的相關(guān)資料,需要的朋友可以參考下2015-12-12

