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();}
}

线程池和信号量模拟酒店(旅店)预定房间相关推荐

  1. python3 信号量和线程池 semaphore ThreadPollExector

    信号量 其实本质上是锁,Lock是单锁,信号量是指定多把锁,也就是说通过信号量指定多个数线程可以访问相同资源,一般情况下读操作可以有多个,但写操作同时只有一个 信号量模块 semaphore 使用起来 ...

  2. 【Linux】生产者消费者编程实现-线程池+信号量

    生产者消费者编程实现,采用了线程池以及信号量技术. 线程的概念就不多说,首先说一下多线程的好处:多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞 ...

  3. Hystrix面试 - 深入 Hystrix 线程池隔离与接口限流

    Hystrix面试 - 深入 Hystrix 线程池隔离与接口限流 前面讲了 Hystrix 的 request cache 请求缓存.fallback 优雅降级.circuit breaker 断路 ...

  4. 【Linux入门】多线程(线程概念、生产者消费者模型、消息队列、线程池)万字解说

    目录 1️⃣线程概念 什么是线程 线程的优点 线程的缺点 线程异常 线程异常 Linux进程VS线程 2️⃣线程控制 创建线程 获取线程的id 线程终止 等待线程 线程分离 3️⃣线程互斥 进程线程间 ...

  5. 多线程-使用大全 基础使用 / 锁 / 线程池 / 原子类 / 并发包 / CAS / AQS (2022版)

    一.多线程描述 1.什么是cpu CPU的中文名称是中央处理器,是进行逻辑运算用的主要由运算器.控制器.寄存器三部分组成, 运算器:从字面意思看就是运算就是起着运算的作用, 控制器:就是负责发出cpu ...

  6. 从构建分布式秒杀系统聊聊线程池

    前言 从0到1构建分布式秒杀系统案例的代码已经全部上传至码云,文章也被分发到各个平台.其中也收到了不少小伙伴喜欢和反馈,有网友如是说: 说实话,能用上的不多,中小企业都不可能用到,大型企业也不是一个人 ...

  7. hystrix 源码 线程池隔离_基于hystrix的线程池隔离

    hystrix进行资源隔离,其实是提供了一个抽象,叫做command,就是说,你如果要把对某一个依赖服务的所有调用请求,全部隔离在同一份资源池内 对这个依赖服务的所有调用请求,全部走这个资源池内的资源 ...

  8. java自定义线程池池,线程池使用及自定义线程池

    一 案例引申 编写代码同时只允许五个线程并发访问(以下文的函数为例子) private static void method() { System.out.println("ThreadNa ...

  9. 【Windows】线程漫谈——线程同步之信号量和互斥量

    本系列意在记录Windwos线程的相关知识点,包括线程基础.线程调度.线程同步.TLS.线程池等 信号量内核对象 信号量内核对象用来进行资源计数,它包含一个使用计数.最大资源数.当前资源计数.最大资源 ...

最新文章

  1. 数据窗口动态生成列_Excel黑科技:教你8个简单实用的图表生成技巧
  2. lunix下的redis数据库操作——hash(哈希)
  3. Linux源代码软件安装,Linux软件安装:源代码与软件安装
  4. GPU版的tensorflow在windows上的安装时的错误解决方案
  5. 1.7 编程基础之字符串 25 最长最短单词 python
  6. ubuntu支持中文设置
  7. 如何从一个吊丝男成为一个合格的高级程序员
  8. Spring MVC学习总结(11)——Spring MVC集成Swagger跨域问题
  9. 【脚本开发】:性能测试-Java虚拟用户实现下载脚本
  10. vscode-JS代码段(JavaScript Snippet Pack)
  11. LEGION: Visually compare modeling techniques for regression
  12. 在MAC下如何显示隐藏文件夹
  13. css绘制梯形图形,及显示矩形图片
  14. Windows系统安装绿色版MySQL8
  15. oracle文件头0号块损坏的处理
  16. JS--实现漂浮广告
  17. vue未登录跳转至登录页面
  18. 分支合并-rebase
  19. 基于CTP的程序化交易系统开发
  20. 《学做智能车——卓晴》学习笔记(1)——智能汽车智能控制器方案设计

热门文章

  1. python manage.py runserver报错
  2. java编程兔子问题_JAVA编程题-用java解决兔子问题
  3. UI优化策略-Shader篇
  4. php gbk 拼音,php 基于gbk和 Ascii把汉字转换为拼音
  5. 安卓巴士Android开发者门户
  6. 锂离子电池健康状态估计简介(一):基于Python的数据处理计算SOH,RUL,CCCT,CVCT
  7. 触类旁通Elasticsearch:关联
  8. CSS入门(CSS常用属性----字体、对齐方式、display属性、浮动)
  9. 亲身实践已解决:Mysql Row size too large ( 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT
  10. R语言与RStudio的下载与安装方法