Java中的Semaphore信号量使用方法代码实例
Semaphore简介
Semaphore是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。
Semaphore可以用来构建一些对象池,资源池之类的,比如数据库连接池,我们也可以创建计数为1的Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,表示两种互斥状态。
它的用法如下:
availablePermits函数用来获取当前可用的资源数量
wc.acquire(); //申请资源 wc.release();// 释放资源 public Semaphore(int permits,boolean fair)
permits:初始化可用的许可数目。
fair: 若该信号量保证在征用时按FIFO的顺序授予许可,则为true,否则为false;
例子
餐厅2个座位,但是有3个人要等位就餐
public class SemaphoreThread extends Thread {
private String name;
private Semaphore semaphore;
public SemaphoreThread(String name, Semaphore semaphore) {
this.name = name;
this.semaphore = semaphore;
}
@Override
public void run() {
if (semaphore.availablePermits() <= 0) {
System.out.println(name + "等位中。。。");
}
try {
semaphore.acquire();
System.out.println(name + "开始就餐了。。");
Thread.sleep(new Random().nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + "吃完了。。");
semaphore.release();
}
}请求
@RequestMapping("test-semaphore")
public void testSemaphore() {
Semaphore semaphore = new Semaphore(2);
for (int i = 1; i <= 3; i++) {
new SemaphoreThread("第" + i + "个人", semaphore).start();
}
}
结果
第1个人开始就餐了。。
第2个人开始就餐了。。
第3个人等位中。。。
第1个人吃完了。。
第3个人开始就餐了。。
第2个人吃完了。。
第3个人吃完了。。
到此这篇关于Java中的Semaphore信号量使用方法代码实例的文章就介绍到这了,更多相关Semaphore信号量使用方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring Cloud Zuul集成Swagger实现过程解析
这篇文章主要介绍了Spring Cloud Zuul集成Swagger实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-11-11
SpringBoot @Import与@Conditional注解使用详解
在了解spring boot自动配置原理前,再来了解下两个注解@Import注解和@Conditional注解,@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean2022-10-10
java进阶解析Springboot上传excel存入数据库步骤
项目需要,写了一个,批量导入的接口。因为需要使用excel去批量导入数据,所以写了一个例子,经过测试已经可以用于实际开发,这里记录一下2021-09-09


最新评论