java semaphore 等待_Java并发编程系列之Semaphore详解

简单介绍

我们以饭店为例,假设饭店只有三个座位,一开始三个座位都是空的。这时如果同时来了三个客人,服务员人允许他们进去用餐,然后对外说暂无座位。后来的客人必须在门口等待,直到有客人离开。这时,如果有一个客人离开,服务员告诉客人,可以进来用餐,如果又有客人离开,则又可以进来客人用餐,如此往复。

在这个饭店中,座位是公共资源,每个人好比一个线程,服务员起的就是信号量的作用。信号量是一个非负整数,表示了当前公共资源的可用数目(在上面的例子中可以用空闲的座位类比信号量),当一个线程要使用公共资源时(在上面的例子中可以用客人比线程),首先要查看信号量,如果信号量的值大于1,则将其减1,然后去占有公共资源。如果信号量的值为0,则线程会将自己阻塞,直到有其它线程释放公共资源。

1、简单介绍Semaphore

a、可用来控制同时访问特定资源的线程数量,以此来达到协调线程工作。

b、维护了一个虚拟的资源池,如果许可为0则线程阻塞等待,直到许可大于0时又可以有机会获取许可了。

c、 内部也有公平锁、非公平锁来访问资源的静态内部类。

2、Semaphore方法

a、public Semaphore(int permits);// 创建一个给定许可数量的信号量对象,且默认以非公平锁方式获取资源

b、public Semaphore(int permits, boolean fair);//创建一个给定许可数量的信号量对象,且是否公平方式由传入的fair布尔参数值决定

c、public void acquire() ;//从此信号量获取一个许可,当许可数量小于零时,则阻塞等待

d、public void acquire(int permits) ;//从此信号量获取permits个许可,当许可数量小于零时,则阻塞等待,但是当阻塞等待的线程被唤醒后发现被中断过的话则会抛InterruptedException异常

e、public void acquireUninterruptibly(int permits) ;从此信号量获取permits个许可,当许可数量小于零时,则阻塞等待,但是当阻塞等待的线程被唤醒后发现被中断过的话则不会抛InterruptedException异常

f、public void release();//释放一个许可

g、public void release(int permits);释放permits个许可

以上只是列出主要方法名,方法详细解释,Semaphore类上面都有注释。就不一一累出来了。

举一个简单例子,帮助我们加深印象

/**

* @author shuliangzhao

* @Title: SemaPhoreTest

* @ProjectName design-parent

* @Description: TODO

* @date 2019/6/5 22:50

*/

public class SemaPhoreTest {

private Semaphore semaphore = new Semaphore(3);

class TaskThread implements Runnable{

private int id;

public TaskThread(int id) {

this.id = id;

}

@Override

public void run() {

try {

semaphore.acquire();

System.out.println("Thread " + id + " is working");

Thread.sleep(2000);

semaphore.release();

System.out.println("Thread " + id + " is over");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) {

SemaPhoreTest semaPhoreTest = new SemaPhoreTest();

/*for (int i = 0;i<6;i++) {

Thread thread = new Thread(semaPhoreTest.new TaskThread(i));

thread.start();

}*/

ExecutorService executorService = Executors.newCachedThreadPool();//同步队列线程

executorService.submit(semaPhoreTest.new TaskThread(1));

executorService.submit(semaPhoreTest.new TaskThread(2));

executorService.submit(semaPhoreTest.new TaskThread(3));

executorService.submit(semaPhoreTest.new TaskThread(4));

executorService.submit(semaPhoreTest.new TaskThread(5));

executorService.submit(semaPhoreTest.new TaskThread(6));

executorService.submit(semaPhoreTest.new TaskThread(7));

executorService.shutdown();

}

}

运行结果

format,png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java垃圾收集蒸馏

串行&#xff0c;并行&#xff0c;并发&#xff0c;CMS&#xff0c;G1&#xff0c;Young Gen&#xff0c;New Gen&#xff0c;Old Gen&#xff0c;Perm Gen&#xff0c;Eden&#xff0c;Tenured&#xff0c;Survivor Spaces&#xff0c;Safepoints和数百个JVM启动标志。 在尝试…

设计模式(二)模板方法模式

1.模版方法模式简介 模版方法模式介绍 在软件开发中&#xff0c;有时会遇到类似的情况&#xff0c;某个方法的实现需要多个步骤&#xff0c;其中有些步骤是固定的&#xff0c;而有些步骤并不固定&#xff0c;存在可变性。为了提高代码的复用性和系统的灵活性&#xff0c;可以…

题解 P2598 【[ZJOI2009]狼和羊的故事】

P2598 [ZJOI2009]狼和羊的故事 题目描述 “狼爱上羊啊爱的疯狂&#xff0c;谁让他们真爱了一场&#xff1b;狼爱上羊啊并不荒唐&#xff0c;他们说有爱就有方向&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;” Orez听到这首歌&#xff0c;心想&am…

前端机试面试题

一、题目要求 1、请实现“https://channel.jd.com/fashion.html”超值购部分内容。 2、使用CSS DIV实现页面布局&#xff0c;页面居中&#xff0c;文字颜色效果要求一致。40分 3、鼠标悬停时的动画效果。10分 4、“进入查看”标签与样式。10分 5、定义一个javascript数组&…

三分大法好

三分算法解决凸形或者凹形函数的极值&#xff1b; 如下图 lmid (Left Right) / 2 rmid (lmid Right) / 2; 如果lmid靠近极值点&#xff0c;则Right rmid&#xff1b; 否则(即midmid靠近极值点)&#xff0c;则Left lmid; 例题的话在我的博客相关分类中找. 转载于:https://w…

将内存消耗减少20倍

这将是另一个故事&#xff0c;与我们分享有关内存相关问题的最新经验。 该案例是从最近的客户支持案例中提取的&#xff0c;在该案例中&#xff0c;我们遇到了一个行为异常严重的应用程序&#xff0c;该应用程序因生产中的OutOfMemoryError消息而死亡。 在连接了Plumbr的情况下…

Flex 布局教程:实例篇

该教程整理自 阮一峰Flexible教程 今天介绍常见布局的Flex写法。你会看到&#xff0c;不管是什么布局&#xff0c;Flex往往都可以几行命令搞定。 我的主要参考资料是Landon Schropp的文章和Solved by Flexbox。 一、骰子的布局 骰子的一面&#xff0c;最多可以放置9个点。 下面…

Apache Server和JMeter调试

我一直在使用JMeter为生产服务器生成负载以测试我的应用程序。 该测试计划具有13个以上的HTTP采样器以发出不同的请求&#xff0c;并具有一个正则表达式提取器以从响应中提取一些值。 此值在连续的HTTP Sampler中使用。 这个测试用例简单而直接。 最初&#xff0c;我使用200个J…

Flexible 弹性盒子模型之flex

实例 让所有弹性盒模型对象的子元素都有相同的长度&#xff0c;忽略它们内部的内容&#xff1a; #main div{flex:1;} 复制 效果预览 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号。 紧跟在 -webkit-, -ms- 或 -moz- 后的数字为支持该前缀属性的第一个版本。 …

java冒泡遍历对象_Java经典排序算法(冒泡、选择、插入)

排序算法说明排序说明对一序列对象根据某个关键字进行排序。术语说明稳定&#xff1a;如果a原本在b前面&#xff0c;而ab&#xff0c;排序之后a仍然在b的前面&#xff1b;不稳定&#xff1a;如果a原本在b的前面&#xff0c;而ab&#xff0c;排序之后a可能会出现在b的后面&#…

快速分类–三向和双枢轴

毫无疑问&#xff0c;Quicksort被认为是本世纪最重要的算法之一&#xff0c;并且它是许多语言&#xff08;包括Java中的Arrays.sort &#xff09;的事实上的系统排序。 那么&#xff0c;quicksort有何新功能&#xff1f; 嗯&#xff0c;除了我现在&#xff08;在Java 7发行了2…

在jekyll模板博客中添加网易云模块

最近使用GitHub Pages Jekyll 搭建了个人博客&#xff0c;作为一名重度音乐患者&#xff0c;博客里面可以不配图&#xff0c;但是不能不配音乐啊。 遂在博客里面引入了网易云模块&#xff0c;这里要感谢网易云的分享机制&#xff0c;对开发者非常友好&#xff1a; 1.每首歌曲…

线性规划对偶原理

留坑啊留坑。。 白天老师讲的都没听说过 晚上肯定整理不玩啊&#xff0c;&#xff0c;&#xff0c; 转载于:https://www.cnblogs.com/zwfymqz/p/8253842.html

java 18.9_Oracle: Java 11 (18.9 LTS) 正式上线!

美国时间9月25日&#xff0c;Oracle 官方表示&#xff0c; Java 11 (18.9 LTS) 正式上线!这是自 Java 8 后的第一个长期支持版本。Java 11 版本说明按照 Oracle 公布的支持路线图&#xff0c;Java 11 将会获得 Oracle 提供的长期支持服务&#xff0c;直至2026年9月。为了更快地…

CSS3新特性应用之用户体验

目录 背景与边框第一部分背景与边框第二部分形状视觉效果字体排印用户体验结构与布局过渡与动画源码下载 一、光标 新增加not-allowed光标&#xff0c;不允许访问隐藏光标&#xff0c;在触模应用上很有用&#xff0c;css2.1需要一个透明的图片来实现&#xff0c;而css3直接用…

day 60 Bootstrip学习

图标地址 http://fontawesome.io/icons/ 图标用法地址 http://fontawesome.io/examples/ 实现代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"I…

谈谈常用清除浮动的方法

我们在做页面布局的时候&#xff0c;经常需要利用浮动来实现一些布局效果&#xff0c;这样带来的后果就会导致父元素丢失宽度。今天我们就来说说‘找回‘宽度的方法。 而清除浮动后的效果应该是这样的请看&#xff1a; 下面就说说方法&#xff0c;方法其实有非常的多&#xf…

ArcGIS API For JS之网络分析(临近设施分析)

ArcGIS 提供两种网络分析&#xff0c;即基于Geometric Network的有向网络或者设施网络和基于Network Dataset的无向网络&#xff0c;在这里网络的分析指后者&#xff0c;ArcGIS api支持网络分析中的最短路径分析、服务区分析、临近设施分析。本文主要讲的是临近设施分析&#x…

UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该版本替换为打包版本。...

最近电脑抽风&#xff0c;我在【应用程序和功能】中重置了以下我的App自然灾害&#xff0c;居然&#xff0c;搞出大新闻了。 它居然从列表中消失了。。。 vs再次编译代码的时候&#xff0c;提示 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 DEP…

泽西岛的RESTful Web服务

我已经讨论了有关体系结构注意事项<< link >>的早期文章&#xff0c;以成为可在我的系统/机器上使用的分布式环境上的RESTful系统。 本文我们将讨论如何基于REST体系结构考虑来构建Web服务。 本教程说明了如何使用Tomcat 6&#xff0c;Eclipse和Jersey JAX-RS&…