Semaphore翻译成字面意思为 信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

Semaphore类位于java.util.concurrent包下,它提供了2个构造器:构造方法说明

public Semaphore(int permits) { }参数permits表示许可数目,即同时可以允许多少线程进行访问

public Semaphore(int permits, boolean fair) { }这个多了一个参数fair表示是否是公平的,即等待时间越久的越先获取许可

下面说一下Semaphore类中比较重要的几个方法,首先是acquire()、release()方法:方法说明

public void acquire() throws InterruptedException {  }//获取一个许可

public void acquire(int permits) throws InterruptedException { }//获取permits个许可

public void release() { }//释放一个许可

public void release(int permits) { }//释放permits个许可

acquire()用来获取一个许可,若无许可能够获得,则会一直等待,直到获得许可。

release()用来释放许可。注意,在释放许可之前,必须先获获得许可。

这4个方法都会被阻塞,如果想立即得到执行结果,可以使用下面几个方法:public boolean tryAcquire() { };    //尝试获取一个许可,若获取成功,则立即返回true,若获取失败,则立即返回false

public boolean tryAcquire(long timeout, TimeUnit unit) throws InterruptedException { };  //尝试获取一个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回false

public boolean tryAcquire(int permits) { }; //尝试获取permits个许可,若获取成功,则立即返回true,若获取失败,则立即返回false

public boolean tryAcquire(int permits, long timeout, TimeUnit unit) throws InterruptedException { }; //尝试获取permits个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回false

另外还可以通过availablePermits()方法得到可用的许可数目。

下面通过一个例子来看一下Semaphore的具体使用:

假若一个工厂有5台机器,但是有8个工人,一台机器同时只能被一个工人使用,只有使用完了,其他工人才能继续使用。那么我们就可以通过Semaphore来实现:public class Test {

public static void main(String[] args) {

int N = 8;            //工人数

Semaphore semaphore = new Semaphore(5); //机器数目

for(int i=0;i

new Worker(i,semaphore).start();

}

static class Worker extends Thread{

private int num;

private Semaphore semaphore;

public Worker(int num,Semaphore semaphore){

this.num = num;

this.semaphore = semaphore;

}

@Override

public void run() {

try {

semaphore.acquire();

System.out.println("工人"+this.num+"占用一个机器在生产...");

Thread.sleep(2000);

System.out.println("工人"+this.num+"释放出机器");

semaphore.release();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

执行结果:工人0占用一个机器在生产...

工人1占用一个机器在生产...

工人2占用一个机器在生产...

工人4占用一个机器在生产...

工人5占用一个机器在生产...

工人0释放出机器

工人2释放出机器

工人3占用一个机器在生产...

工人7占用一个机器在生产...

工人4释放出机器

工人5释放出机器

工人1释放出机器

工人6占用一个机器在生产...

工人3释放出机器

工人7释放出机器

工人6释放出机器

java semaphore(0)_Semaphore相关推荐

  1. java semaphore(0)_面试官:说说Java中的信号量?Semaphore

    Semaphore (信号量)是由计算机科学家Dijkstra在1965年提出的,广泛应用不同的操作系统,在管程提出之前信号量就是并发编程领域的霸主!几乎所有并发的语言都支持信号量机制. Semaph ...

  2. Java Semaphore实现线程池任务调度

    2019独角兽企业重金招聘Python工程师标准>>> 关于Semaphore举例 以一个停车场运作为例.为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的.这时如果同时来 ...

  3. Java Semaphore 信号量

    Java Semaphore 信号量 Semaphore 是一种基于计数的信号量.它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞.S ...

  4. 【最新版】Win10 Java jdk14.0.2安装及环境变量配置

    1.下载安装 下载地址:https://www.oracle.com/java/technologies/javase-jdk14-downloads.html,根据提示进行安装,记住安装路径,这里路 ...

  5. Java OpenCV-4.0.0 图像处理22 图像模板匹配

    Java OpenCV-4.0.0 图像处理22 图像模板匹配 参考链接:https://blog.csdn.net/qq_34814092/article/details/95813654 Java ...

  6. 【Java从0到架构师(1),Java中高级面试题总结(全面)

    JSP 九大内置对象 MySQL 基础 + 多表查询 [Java从0到架构师]MySQL 基础 MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DD ...

  7. 用 for/in 在 Java 5.0 中增强循环

    http://www.ibm.com/developerworks/cn/java/j-forin.html 简介: for/in 循环通常叫作 增强的 for 或者 foreach,它是 Java ...

  8. cmpp3.0协议 java,JAVA CMPP3.0协议实现

    JAVA CMPP3.0协议实现 java 2020-7-16 下载地址 https://www.codedown123.com/30108.html JAVA CMPP3.0协议实现 资源下载此资源 ...

  9. 使用Java 8.0进行类型安全的依赖注入

    所以有时我真的很想念旧学校的依赖注入. 当Spring仍然"轻量级"时,我们很高兴地用" 一天学习 " Spring bean xml配置在applicatio ...

最新文章

  1. 2021年大数据ELK(八):Elasticsearch安装IK分词器插件
  2. (C++)堆排序的3个关键函数
  3. 09-JS中table模糊查询
  4. 网页 服务器长连接超时时间,服务器设置长连接超时时间
  5. 我的Java开发学习之旅------gt;Base64的编码思想以及Java实现
  6. boost::geometry模块自定义多边形示例
  7. C语言试题二十九之编写函数int function(int lim,int aa[max])求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数。
  8. aud to php,HKD to PHP
  9. python-笔记(二)数据类型
  10. spring 官方文档
  11. 如何减小电压跟随器输出电阻_电压跟随器秘笈:LM358电压跟随器+运放问题
  12. android studio实现ar,在Android Studio上运行EasyAR
  13. 特征提取之文本特征提取
  14. Linux安装JDK步骤
  15. 一文读懂hosts文件
  16. 大学概率论与数理统计知识点详细整理
  17. 怎么将WPS转换成WORD?看完你就学会了
  18. wcf教程-传递数据过大怎么配置?读取 XML 数据时,超出最大字符串内容长度配额 (8192)
  19. 给未来的自己一封信计算机,给未来的自己一封信范文(通用10篇)
  20. 俄语计算机考研,研友分享:俄语考研91分的经验体会

热门文章

  1. 难以想象,25 年前互联网大佬在最原始的论坛冲浪!
  2. python startswith函数_Python Pandas Series.str.startswith()用法及代码示例
  3. 3D LUT Creator操作基础系列(合集)
  4. 制作黑苹果U盘clover引导(懒人版)
  5. 潮流计算程序————求解雅克比矩阵
  6. 上传阿里云oss对象型存储 本地文件和上传流上传
  7. java字符串压缩js解压_接口实现后台GZIP压缩,pako.js 前端解压
  8. 抖音世界杯直播的低延迟是怎么做到的?
  9. Live800:618“电商大战”,新老玩家有何套路?
  10. combobox 远程url java返回参数_TopJUI可编辑表格的列根据返回数据判断是使用 combobox 还是 numberbox...