原创:转载需注明原创地址 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使用的更多相关文章

  1. Java线程并发:知识点

    Java线程并发:知识点   发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用.   逃逸:在对象尚未准备 ...

  2. 【转载】 Java线程面试题 Top 50

    Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...

  3. Java线程新特征——Java并发库

    一.线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...

  4. Java线程:概念与原理

    Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...

  5. Java线程面试题 Top 50 (转载)

    转载自:http://www.cnblogs.com/dolphin0520/p/3958019.html 原文链接:http://www.importnew.com/12773.html   本文由 ...

  6. java线程详解

    Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...

  7. 50 道 Java 线程面试题(转载自牛客网)

    下面是 Java 线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理 ...

  8. Java线程面试题 Top 50

    转自:http://www.importnew.com/12773.html 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java ...

  9. 【多线程】Java线程面试题 Top 50(转载)

    Java线程面试题 Top 50 原文链接:http://www.importnew.com/12773.html   本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎 ...

随机推荐

  1. Java Web程序设计笔记 • 【目录】

    章节 内容 实践练习 Java Web程序设计作业目录(作业笔记) 第1章 Java Web程序设计笔记 • [第1章 Web应用程序] 第2章 Java Web程序设计笔记 • [第2章 JSP基础 ...

  2. C# 后台发送get,post请求及WebApi接收

    后台发送get请求 1.发送带参数的get请求 /// <summary> /// 发送get请求 参数拼接在url后面 /// </summary> /// <para ...

  3. Oracle的dbf文件迁移

    1.背景说明 在Oracle数据库中插入了1.5亿条数据, 并且创建了主键索引, 又插入了1.5亿条数据到另外一张表, 导致数据库表空间暴涨到28G, 由于根目录下只有50G的空间, 数据库文件所在磁 ...

  4. MD5,SHA1及SHA256等哈希加密方法实现:Java,C#,Golang,Python

    哈希算法又称散列算法,它可以从任何数据中快速的创建一个凭证,而这个凭证很难被推倒出来,因为一丁点的变化会导致凭证的差别恨到,也就是说哈希算法具有不可逆性,因此它在密码数据校验方面用的很广,比如我们常用 ...

  5. js箭头函数 的 (e) => { } 写法笔记

    1. (e) => {} 是ES 6 新语法,默认是Es 5.1,因此在这里设置一下就不会提示红色下划线了 2.使用: (e) => {}  , 其实就是function (e){} 的缩 ...

  6. 35个JAVA性能优化总结

    原文链接:http://mp.weixin.qq.com/s/J614jGM_oMrzdeS_ivmhvA   代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对 ...

  7. 你不得不了解的Python3.x新特性

    从 3.0 到 3.8,Python 3 已经更新了一波又一波,但似乎我们用起来和 2.7 没有太大区别?以前该怎么写 2.7 的代码现在就怎么写,只不过少数表达方式变了而已.在这篇文章中,作者介绍了 ...

  8. 【基因组学】maker的安装和注释

    本文默认读者有一定的生信基础,没有基础的可以阅读以前的笔记内容. maker作为比较受人认可的基因组注释软件,其流程较为清晰简单. 不知何故,我的conda无法安装maker,故而采用手动安装方式. ...

  9. SRC(不定期更新)

    主域名收集 响应包 Content-Security-Policy-Report-Only

  10. 【Kafka】基于Windows环境的Kafka有关环境(scala+zookeeper+kafka+可视化工具)搭建、以及使用.NET环境开发的案例代码与演示

    前言:基于Windows系统下的Kafka环境搭建:以及使用.NET 6环境进行开发简单的生产者与消费者的演示. 一.环境部署 Kafka是使用Java语言和Scala语言开发的,所以需要有对应的Ja ...