java semaphore(0)_Semaphore
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相关推荐
- java semaphore(0)_面试官:说说Java中的信号量?Semaphore
Semaphore (信号量)是由计算机科学家Dijkstra在1965年提出的,广泛应用不同的操作系统,在管程提出之前信号量就是并发编程领域的霸主!几乎所有并发的语言都支持信号量机制. Semaph ...
- Java Semaphore实现线程池任务调度
2019独角兽企业重金招聘Python工程师标准>>> 关于Semaphore举例 以一个停车场运作为例.为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的.这时如果同时来 ...
- Java Semaphore 信号量
Java Semaphore 信号量 Semaphore 是一种基于计数的信号量.它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞.S ...
- 【最新版】Win10 Java jdk14.0.2安装及环境变量配置
1.下载安装 下载地址:https://www.oracle.com/java/technologies/javase-jdk14-downloads.html,根据提示进行安装,记住安装路径,这里路 ...
- Java OpenCV-4.0.0 图像处理22 图像模板匹配
Java OpenCV-4.0.0 图像处理22 图像模板匹配 参考链接:https://blog.csdn.net/qq_34814092/article/details/95813654 Java ...
- 【Java从0到架构师(1),Java中高级面试题总结(全面)
JSP 九大内置对象 MySQL 基础 + 多表查询 [Java从0到架构师]MySQL 基础 MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DD ...
- 用 for/in 在 Java 5.0 中增强循环
http://www.ibm.com/developerworks/cn/java/j-forin.html 简介: for/in 循环通常叫作 增强的 for 或者 foreach,它是 Java ...
- cmpp3.0协议 java,JAVA CMPP3.0协议实现
JAVA CMPP3.0协议实现 java 2020-7-16 下载地址 https://www.codedown123.com/30108.html JAVA CMPP3.0协议实现 资源下载此资源 ...
- 使用Java 8.0进行类型安全的依赖注入
所以有时我真的很想念旧学校的依赖注入. 当Spring仍然"轻量级"时,我们很高兴地用" 一天学习 " Spring bean xml配置在applicatio ...
最新文章
- 2021年大数据ELK(八):Elasticsearch安装IK分词器插件
- (C++)堆排序的3个关键函数
- 09-JS中table模糊查询
- 网页 服务器长连接超时时间,服务器设置长连接超时时间
- 我的Java开发学习之旅------gt;Base64的编码思想以及Java实现
- boost::geometry模块自定义多边形示例
- C语言试题二十九之编写函数int function(int lim,int aa[max])求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数。
- aud to php,HKD to PHP
- python-笔记(二)数据类型
- spring 官方文档
- 如何减小电压跟随器输出电阻_电压跟随器秘笈:LM358电压跟随器+运放问题
- android studio实现ar,在Android Studio上运行EasyAR
- 特征提取之文本特征提取
- Linux安装JDK步骤
- 一文读懂hosts文件
- 大学概率论与数理统计知识点详细整理
- 怎么将WPS转换成WORD?看完你就学会了
- wcf教程-传递数据过大怎么配置?读取 XML 数据时,超出最大字符串内容长度配额 (8192)
- 给未来的自己一封信计算机,给未来的自己一封信范文(通用10篇)
- 俄语计算机考研,研友分享:俄语考研91分的经验体会
热门文章
- 难以想象,25 年前互联网大佬在最原始的论坛冲浪!
- python startswith函数_Python Pandas Series.str.startswith()用法及代码示例
- 3D LUT Creator操作基础系列(合集)
- 制作黑苹果U盘clover引导(懒人版)
- 潮流计算程序————求解雅克比矩阵
- 上传阿里云oss对象型存储 本地文件和上传流上传
- java字符串压缩js解压_接口实现后台GZIP压缩,pako.js 前端解压
- 抖音世界杯直播的低延迟是怎么做到的?
- Live800:618“电商大战”,新老玩家有何套路?
- combobox 远程url java返回参数_TopJUI可编辑表格的列根据返回数据判断是使用 combobox 还是 numberbox...