- 一、Semaphore的理解
- 二、Semaphore类中常用方法
- 三、Semaphore类的使用示例
- Semaphore属于java.util.concurrent包;
- Semaphore翻译成字面意思为信号量,Semaphore可以控制同时访问的线程个数,通过acquire()获取一个许可,如果没有就等待,而release()释放一个许可。
-
public void acquire() 用来获取一个许可,若无许可能够获得,则会一直等待,直到获得许可。
-
public void acquire(int permits) 获取permits个许可。
-
public void release() 释放许可。注意,在释放许可之前,必须先获得许可。
-
public void release(int permits) 释放permits个许可。 注:以上4个方法都会被阻塞,如果想立即得到执行结果,可以使用下面几个方法。
-
public boolean tryAcquire() 尝试获取一个许可,若获取成功,则立即放回true,若获取失败,则立即返回false
-
public boolean tryAcquire(long timeout, TimeUnit unit) 尝试获取一个许可,若在指定的时间内获取成功,则立即放回true。否则立即返回false
-
public boolean tryAcquire(int permits) 尝试获取permits个许可。若获取成功,则立即放回true,,若获取失败,则立即返回false。
-
public boolean tryAcquire(int permits, long timeout, TimeUnit unit)尝试获取permits个许可。若在指定的时间内获取成功,则立即返回true,否则则立即返回false。
-
还可以通过availablePermits()方法得到可用的许可数目。
使用场景: 停车场容纳总停车量5, 停车场剩余车位不足时,车辆只能在外面等待。 每有一辆车驶出停车场后,显示牌的剩余车位数响应的加1。 当一辆车进入停车场后,显示牌的剩余车位数响应的减1.
1、代码
package com.xz.thread.Semaphore;
import java.util.Random;
import java.util.concurrent.Semaphore;
/**
* @description: 停车场容纳总停车量5,
* 停车场剩余车位不足时,车辆只能在外面等待。
* 每有一辆车驶出停车场后,显示牌的剩余车位数响应的加1。
* 当一辆车进入停车场后,显示牌的剩余车位数响应的减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
关注
打赏
- Netty—— 概念剖析(NIO vs BIO)
- Netty——网络编程 NIO(Selector处理accept事件)代码示例
- CompletableFuture异步编排(多任务组合)
- CompletableFuture异步编排(两任务组合——两个任务必须都完成才触发另一个任务 )
- CompletableFuture异步编排(线程串行化代码示例)
- CompletableFuture异步编排(handle最终处理)
- CompletableFuture异步编排(计算完成回调代码示例)
- hutool工具导出excel代码示例
- CompletableFuture异步编排(开启异步编程代码示例)
- java 获取音频、视频文件时长代码示例