Java线程--Semaphore使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11872132.html
Java线程--Semaphore使用
Semaphore是信号量, 也叫许可证管理器, 类似于取票窗口, 办事窗口, 打饭窗口等等这种情况, 只有排队等到了这样才算拿到了信号量, 拿到了许可证 .
package concurrent.semaphore; import java.util.concurrent.Semaphore; /**
* 信号量 , 许可证管理器 main 测试类
*/
public class MainTest { public static void main(String[] args) throws InterruptedException {
/**
* 定义2个取票窗口, 公平的排队取票
*/
Semaphore ticketWindow = new Semaphore(2, true);
Thread[] threads = new Thread[10];
for (int i = 0 ; i < 30; i++) {
/**
* 前面十个小伙伴坚持排队
*/
if (i < 10) {
new Thread(new Man("坐火车良民" + i, ticketWindow, 0)).start();
} else if (i >= 10 && i < 20) {
/**
* 这5个小伙伴没有耐心,只会等1毫秒
*/
new Thread(new Man("坐飞机良民" + i, ticketWindow, 1)).start();
} else {
/**
* 这5个小伙伴没有耐心
*/
threads[i - 20] = new Thread(new Man("回家吃饭良民" + i, ticketWindow, 2));
threads[i - 20].start();
}
} Thread.sleep(2000);
for (int i = 0; i < 5; i++) {
threads[i].interrupt();
}
} void show(){
/**
* 初始化许可证数量, 5个许可证/信号量, 公平模式
*/
Semaphore semaphore = new Semaphore(5, true);
try {
/**
* 获取一个许可证/信号量
* 此线程会一直阻塞,直到获取这个许可证,或者被中断(抛出InterruptedException异常)
*/
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
/**
* 释放一个许可证/信号量
*/
semaphore.release();
try {
/**
* 获取3个许可证/信号量
* 此线程会一直阻塞,直到获取这个许可证,或者被中断(抛出InterruptedException异常)
*/
semaphore.acquire(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
/**
* 释放3个许可证/信号量
*/
semaphore.release(3);
/**
* 是否有正在等待许可证的线程
*/
semaphore.hasQueuedThreads();
/**
* 正在等待许可证的队列长度(线程数量)
*/
semaphore.getQueueLength();
/**
* 剩余许可证的数量
*/
semaphore.drainPermits();
/**
* 尝试获取, 获取不到就返回false
*/
semaphore.tryAcquire();
/**
* 获取的时候无法被打断
*/
semaphore.acquireUninterruptibly();
}
}
package concurrent.semaphore; import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit; /**
* 排队取票的人
*/
public class Man implements Runnable { /**
* 取票的人的姓名
*/
private String name;
/**
* 必须要的取票证明
*/
private Semaphore semaphore;
/**
* 最后的行为
* 0 : 取到票为止
* 1 : 排队的时候不耐烦, 走了, 买飞机票去了
* 2 : 排队的时候突然有事, 回家去了
*/
private int behav; public Man(String name, Semaphore semaphore, int behav) {
this.name = name;
this.semaphore = semaphore;
this.behav = behav;
} @Override
public void run() {
switch (behav) {
/**
* 坚持到底
*/
case 0 :
/**
* 排队, 坚持不懈 , 就是要拿到许可证
*/
semaphore.acquireUninterruptibly();
try {
Thread.sleep(1000);
System.out.println("我正在取票啦!! " + name);
} catch (InterruptedException e) {
e.printStackTrace();
}
semaphore.release();
System.out.println("哇, 我终于取到票啦!! " + name);
break;
/**
* 买不到我就坐飞机
*/
case 1 :
try {
if (semaphore.tryAcquire(1, TimeUnit.SECONDS)) {
System.out.println("我正在取票啦!! " + name);
Thread.sleep(2000);
semaphore.release();
System.out.println("哇, 我终于取到票啦!! " + name);
} else {
System.out.println("我不取了, 坐飞机去啦!! " + name);
}
break;
} catch (InterruptedException e) {
e.printStackTrace();
}
/**
* 买不到我就回家
*/
case 2 :
try {
semaphore.acquire();
try {
Thread.sleep(1000);
System.out.println("我正在取票啦!! " + name);
} catch (InterruptedException e) {
e.printStackTrace();
}
semaphore.release();
System.out.println("哇, 我终于取到票啦!! " + name);
} catch (InterruptedException e) {
//e.printStackTrace();
System.out.println("算了, 回家吃饭去了 " + name);
}
break;
/**
* 不知道这个人是干嘛的, 黄牛吧
*/
default:
break;
}
}
}
打印如下:
我正在取票啦!! 坐火车良民0
我正在取票啦!! 坐火车良民1
哇, 我终于取到票啦!! 坐火车良民0
哇, 我终于取到票啦!! 坐火车良民1
我不取了, 坐飞机去啦!! 坐飞机良民10
我不取了, 坐飞机去啦!! 坐飞机良民17
我不取了, 坐飞机去啦!! 坐飞机良民19
我不取了, 坐飞机去啦!! 坐飞机良民16
我不取了, 坐飞机去啦!! 坐飞机良民13
我不取了, 坐飞机去啦!! 坐飞机良民15
我不取了, 坐飞机去啦!! 坐飞机良民14
我不取了, 坐飞机去啦!! 坐飞机良民12
我不取了, 坐飞机去啦!! 坐飞机良民11
我不取了, 坐飞机去啦!! 坐飞机良民18
我正在取票啦!! 坐火车良民3
哇, 我终于取到票啦!! 坐火车良民3
我正在取票啦!! 坐火车良民2
哇, 我终于取到票啦!! 坐火车良民2
算了, 回家吃饭去了 回家吃饭良民20
算了, 回家吃饭去了 回家吃饭良民23
算了, 回家吃饭去了 回家吃饭良民22
算了, 回家吃饭去了 回家吃饭良民24
算了, 回家吃饭去了 回家吃饭良民21
我正在取票啦!! 坐火车良民4
哇, 我终于取到票啦!! 坐火车良民4
我正在取票啦!! 坐火车良民5
哇, 我终于取到票啦!! 坐火车良民5
我正在取票啦!! 坐火车良民6
哇, 我终于取到票啦!! 坐火车良民6
我正在取票啦!! 坐火车良民7
哇, 我终于取到票啦!! 坐火车良民7
我正在取票啦!! 坐火车良民8
哇, 我终于取到票啦!! 坐火车良民8
我正在取票啦!! 坐火车良民9
哇, 我终于取到票啦!! 坐火车良民9
我正在取票啦!! 回家吃饭良民25
哇, 我终于取到票啦!! 回家吃饭良民25
我正在取票啦!! 回家吃饭良民26
哇, 我终于取到票啦!! 回家吃饭良民26
我正在取票啦!! 回家吃饭良民29
哇, 我终于取到票啦!! 回家吃饭良民29
我正在取票啦!! 回家吃饭良民27
哇, 我终于取到票啦!! 回家吃饭良民27
我正在取票啦!! 回家吃饭良民28
哇, 我终于取到票啦!! 回家吃饭良民28
Java线程--Semaphore使用的更多相关文章
- Java线程并发:知识点
Java线程并发:知识点 发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用. 逃逸:在对象尚未准备 ...
- 【转载】 Java线程面试题 Top 50
Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...
- Java线程新特征——Java并发库
一.线程池 Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...
- Java线程:概念与原理
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...
- Java线程面试题 Top 50 (转载)
转载自:http://www.cnblogs.com/dolphin0520/p/3958019.html 原文链接:http://www.importnew.com/12773.html 本文由 ...
- java线程详解
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...
- 50 道 Java 线程面试题(转载自牛客网)
下面是 Java 线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理 ...
- Java线程面试题 Top 50
转自:http://www.importnew.com/12773.html 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java ...
- 【多线程】Java线程面试题 Top 50(转载)
Java线程面试题 Top 50 原文链接:http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎 ...
随机推荐
- 「影院售票系统」 · Java Swing + MySQL JDBC开发
目录 文档说明: 一.语言和环境 二.实现功能 三.数据库设计 四.具体要求及推荐实现步骤 五.注意事项 六.评分标准 实现代码: 一.数据库: 二.Java Swing: com.ynavc.Bea ...
- RSA非对称加密算法实现:Java
RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA ...
- Python_time&datetime
获取常用日常时间 # encoding: utf-8 import time import datetime # 当前时间 datetime_now_time = datetime.datetime. ...
- Centos下查看cpu核数
1.概念物理CPU:实际Server中插槽上的CPU个数.物理cpu数量:可以数不重复的 physical id 有几个. 2.逻辑CPULinux用户对 /proc/cpuinfo 这个文件肯定不陌 ...
- 初识python: 递归函数 - 分解质因数
分解质因数: 任何一个合数都可以写成几个质数相乘的形式.其中每个质数都是这个合数的因数,叫做这个合数的分解质因数.分解质因数只针对合数. 比如: 8 分解质因数是:2*2*2 10分解质因数是:2*5 ...
- 初识python: 集合
集合是一个无序的,不重复的数据组合.主要作用如下:1.去重,把一个列表变成集合,会自动去重:2.关系测试,测试两组数据之前的交集.差集.并集等关系 #!/user/bin env python # a ...
- 安装devstack中遇到的一些问题整理
1.执行stack.sh文件后提示 ./stack.sh:528:check_path_perm_sanity /opt/devstack/functions:582:die [ERROR] /opt ...
- HTML5元素
1.1结构元素 HTML5定义了一组新的语义化标签,目前主流浏览器均已支持,语义化标签使用标记元素的内容,虽然可以使用原有标签替换,但是它可以简化HTML页面设计,并且也为搜索引擎在抓取和索引网页的时 ...
- [JavaWeb]反序列化分析(二)--CommonCollections1
反序列化分析(二)--CommonCollections1 链子分析 首先新建一个TransformedMap,其中二三参数为可控,后续要用到 当TransformedMap执行put方法时,会分别执 ...
- gin中自定义路由日志的格式
package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" &quo ...