Java中的Semaphore信号量使用方法代码实例

 更新时间:2023年11月21日 11:17:30   作者:解说柯基mkq  
这篇文章主要介绍了Java中的Semaphore信号量使用方法代码实例,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信号量使用方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Maven根据不同环境打包不同配置文件的方法

    Maven根据不同环境打包不同配置文件的方法

    这篇文章主要介绍了Maven根据不同环境打包不同配置文件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • SpringBoot中JPA实现Sort排序的三种方式小结

    SpringBoot中JPA实现Sort排序的三种方式小结

    这篇文章主要介绍了SpringBoot中JPA实现Sort排序的三种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • SpringAOP实现自定义接口权限控制

    SpringAOP实现自定义接口权限控制

    本文主要介绍了SpringAOP实现自定义接口权限控制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • 使用纯Java实现一个WebSSH项目的示例代码

    使用纯Java实现一个WebSSH项目的示例代码

    这篇文章主要介绍了使用纯Java实现一个WebSSH项目,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Java编程实现swing圆形按钮实例代码

    Java编程实现swing圆形按钮实例代码

    这篇文章主要介绍了Java编程实现swing圆形按钮实例代码,涉及两个简单的Java实现按钮的代码,其中一个具有侦测点击事件的简单功能,具有一定借鉴价值,需要的朋友可以参考。
    2017-11-11
  • Tomcat数据源配置方法_JBuilder中

    Tomcat数据源配置方法_JBuilder中

    今天帮一同事配置一个数据源,采用tomcat5.5.9,本来是个很简单的事,以前也配过,但由于很长时间没用过容器提供的数据源了(IOC用惯了),也只记的个大概了,所以刚开始一配就出错了,google了一下,有很多资料,照着试试却都不好使(到不是别人说的不对,只是大家用的版本不同)。
    2008-10-10
  • 基于SpringBoot上传任意文件功能的实现

    基于SpringBoot上传任意文件功能的实现

    下面小编就为大家带来一篇基于SpringBoot上传任意文件功能的实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • spring基础系列之JavaConfig配置详解

    spring基础系列之JavaConfig配置详解

    本篇文章主要介绍了spring基础系列之JavaConfig配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 详谈Java泛型中T和问号(通配符)的区别

    详谈Java泛型中T和问号(通配符)的区别

    下面小编就为大家带来一篇详谈Java泛型中T和问号(通配符)的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Spring refresh()源码解析

    Spring refresh()源码解析

    这篇文章主要为大家介绍了Spring refresh()源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03

最新评论