线程池和信号量模拟酒店(旅店)预定房间
Semaphore构造和常用方法:
Semaphore s = new Semaphore(10); //Semaphore构造方法传入一个初始可用数
s.acquire(n); // s.acquire(); 不传n表示获取一个可用
s.release(n); // s.release(); 不传n表示释放一个可用
s.availablePermits(); // 获取可用的数量,这是个异步方法
s.drainPermits(); // 清空所有可用,相当于来了个大boss,说我把剩下的房间全包了
s.getQueueLength(); // 获取队列中(等待中)的线程数量
信号量的作用是相当于在多个线程之间通信。
下面用酒店定房间的例子来说明用法:
/*** 预定旅店的例子* 一个旅店只有10个房间,有10起预定的请求,每个请求随机订2-5间*/
public class SemaphoreHotel {private static Semaphore s = new Semaphore(10); // 旅店有10个房间static class HotelTask implements Runnable {@Overridepublic void run() {int n = (2 + (int) (Math.random() * (5- 2))) ; //2-5间try {s.acquire(n); // 预定n个房间,别人就不能预定了Thread.sleep(10);System.out.println(Thread.currentThread().getName() + "占用房间数" + n+",可用房间数"+s.availablePermits());long l = (2 + (int) (Math.random() * (5 - 2))) * 1000;System.out.println(Thread.currentThread().getName() + "占用时长" + l);TimeUnit.MILLISECONDS.sleep(l); // 比Thread.sleep()更人性化吧} catch (InterruptedException e) {e.printStackTrace();} finally {s.release(n); // 释放3个房间System.out.println(Thread.currentThread().getName() + "释放房间数" + n+",可用房间数"+s.availablePermits());}}}public static void main(String[] args) {ExecutorService pool = Executors.newCachedThreadPool();for (int i = 0; i < 10; i++) {pool.execute(new HotelTask());}pool.shutdown();}
}
线程池和信号量模拟酒店(旅店)预定房间相关推荐
- python3 信号量和线程池 semaphore ThreadPollExector
信号量 其实本质上是锁,Lock是单锁,信号量是指定多把锁,也就是说通过信号量指定多个数线程可以访问相同资源,一般情况下读操作可以有多个,但写操作同时只有一个 信号量模块 semaphore 使用起来 ...
- 【Linux】生产者消费者编程实现-线程池+信号量
生产者消费者编程实现,采用了线程池以及信号量技术. 线程的概念就不多说,首先说一下多线程的好处:多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞 ...
- Hystrix面试 - 深入 Hystrix 线程池隔离与接口限流
Hystrix面试 - 深入 Hystrix 线程池隔离与接口限流 前面讲了 Hystrix 的 request cache 请求缓存.fallback 优雅降级.circuit breaker 断路 ...
- 【Linux入门】多线程(线程概念、生产者消费者模型、消息队列、线程池)万字解说
目录 1️⃣线程概念 什么是线程 线程的优点 线程的缺点 线程异常 线程异常 Linux进程VS线程 2️⃣线程控制 创建线程 获取线程的id 线程终止 等待线程 线程分离 3️⃣线程互斥 进程线程间 ...
- 多线程-使用大全 基础使用 / 锁 / 线程池 / 原子类 / 并发包 / CAS / AQS (2022版)
一.多线程描述 1.什么是cpu CPU的中文名称是中央处理器,是进行逻辑运算用的主要由运算器.控制器.寄存器三部分组成, 运算器:从字面意思看就是运算就是起着运算的作用, 控制器:就是负责发出cpu ...
- 从构建分布式秒杀系统聊聊线程池
前言 从0到1构建分布式秒杀系统案例的代码已经全部上传至码云,文章也被分发到各个平台.其中也收到了不少小伙伴喜欢和反馈,有网友如是说: 说实话,能用上的不多,中小企业都不可能用到,大型企业也不是一个人 ...
- hystrix 源码 线程池隔离_基于hystrix的线程池隔离
hystrix进行资源隔离,其实是提供了一个抽象,叫做command,就是说,你如果要把对某一个依赖服务的所有调用请求,全部隔离在同一份资源池内 对这个依赖服务的所有调用请求,全部走这个资源池内的资源 ...
- java自定义线程池池,线程池使用及自定义线程池
一 案例引申 编写代码同时只允许五个线程并发访问(以下文的函数为例子) private static void method() { System.out.println("ThreadNa ...
- 【Windows】线程漫谈——线程同步之信号量和互斥量
本系列意在记录Windwos线程的相关知识点,包括线程基础.线程调度.线程同步.TLS.线程池等 信号量内核对象 信号量内核对象用来进行资源计数,它包含一个使用计数.最大资源数.当前资源计数.最大资源 ...
最新文章
- 数据窗口动态生成列_Excel黑科技:教你8个简单实用的图表生成技巧
- lunix下的redis数据库操作——hash(哈希)
- Linux源代码软件安装,Linux软件安装:源代码与软件安装
- GPU版的tensorflow在windows上的安装时的错误解决方案
- 1.7 编程基础之字符串 25 最长最短单词 python
- ubuntu支持中文设置
- 如何从一个吊丝男成为一个合格的高级程序员
- Spring MVC学习总结(11)——Spring MVC集成Swagger跨域问题
- 【脚本开发】:性能测试-Java虚拟用户实现下载脚本
- vscode-JS代码段(JavaScript Snippet Pack)
- LEGION: Visually compare modeling techniques for regression
- 在MAC下如何显示隐藏文件夹
- css绘制梯形图形,及显示矩形图片
- Windows系统安装绿色版MySQL8
- oracle文件头0号块损坏的处理
- JS--实现漂浮广告
- vue未登录跳转至登录页面
- 分支合并-rebase
- 基于CTP的程序化交易系统开发
- 《学做智能车——卓晴》学习笔记(1)——智能汽车智能控制器方案设计
热门文章
- python manage.py runserver报错
- java编程兔子问题_JAVA编程题-用java解决兔子问题
- UI优化策略-Shader篇
- php gbk 拼音,php 基于gbk和 Ascii把汉字转换为拼音
- 安卓巴士Android开发者门户
- 锂离子电池健康状态估计简介(一):基于Python的数据处理计算SOH,RUL,CCCT,CVCT
- 触类旁通Elasticsearch:关联
- CSS入门(CSS常用属性----字体、对齐方式、display属性、浮动)
- 亲身实践已解决:Mysql Row size too large ( 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT
- R语言与RStudio的下载与安装方法