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。
當(dāng)一輛車進入停車場后,顯示牌的剩余車位數(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。 * 當(dāng)一輛車進入停車場后,顯示牌的剩余車位數(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)文章
Spring Cloud Gateway實現(xiàn)灰度發(fā)布方案
灰度發(fā)布是在微服務(wù)中的表現(xiàn)為同一服務(wù)同時上線不同版本,讓一部分用戶使用新版本來驗證新特性,如果驗證沒有問題,則將所有用戶都遷移到新版本上,本文就來介紹一下如何實現(xiàn),感興趣的可以了解一下2023-12-12