- 一、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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?