多线程之Semaphore信号量

ops/2024/11/14 2:09:37/

一、什么是信号量

Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。在多线程中经常会遇到该应用场景,信号量如同交通公路中的红绿灯一样,需要限流,举例如下:

高速路线的承载有限,只能允许100辆车在高速路行驶,如何控制呢?就需要红路灯来限制,若发现高速路段路段有100辆车,则信号量控制,不让车驶入;若发现有10辆车驶出,则信号量方向10辆车;

二、多线程中的应用

Semaphore semaphore = new Semaphore(5);
System.out.println("开始");
for(int i = 0;i < 10; i++) {CompletableFuture.runAsync(() -> {try {semaphore.acquire();System.out.println(Thread.currentThread().getId() + "异步线程aaaaaaaaa");ThreadUtil.sleep(1000 * 1);} catch (InterruptedException e) {throw new RuntimeException(e);} finally {semaphore.release();}});
}

初始化5个信号量,CompletableFuture异步线程获取一个许可,然后线程等待1s,执行时候发现,第一秒打印5条,第二秒打印5条;若初始化信号量10个,则执行发现第一秒打印10条。

三、信号量的其他方法

1.semaphore.acquire(5) 获取5个信号量,每次全部获取,则线程都会等待

2.semaphore.tryAcquire() 尝试获取一个许可,如果未获取到,不等待,将直接丢弃该线程不执行
 

        Semaphore semaphore = new Semaphore(5);System.out.println("开始");for(int i = 0;i < 10; i++) {CompletableFuture.runAsync(() -> {if(semaphore.tryAcquire()) {System.out.println(Thread.currentThread().getId() + "异步线程aaaaaaaaa");ThreadUtil.sleep(1000 * 1);semaphore.release();}});}


http://www.ppmy.cn/ops/133435.html

相关文章

ThinkBook 14+ 2024 Ubuntu 触控板失效 驱动缺失问题解决

首先我的电脑是thinkbook14 2024&#xff0c;从ubuntu18到ubuntu24&#xff0c;笔者整个都试了一遍&#xff0c;触摸板都没反应&#xff0c;确认不是linux系统内核问题&#xff0c;原因为驱动缺失。 解决步骤&#xff1a; &#xff08;1&#xff09;下载驱动&#xff0c;网址如…

微搭低代码入门01变量

目录 1 变量的定义2 变量的赋值3 变量的类型4 算术运算符5 字符串的连接6 模板字符串7 检查变量的类型8 解构赋值8.1 数组的解构赋值8.2 对象的解构赋值 9 类型转换9.1 转换为字符串9.2 转换为数字9.3 转换为布尔值 总结 好些零基础的同学&#xff0c;在使用低代码的时候&#…

React Hooks在现代前端开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 React Hooks在现代前端开发中的应用 React Hooks在现代前端开发中的应用 React Hooks在现代前端开发中的应用 引言 React Hooks …

计算机网络易混淆知识点串记

文章目录 计算机网络易混淆知识点串记各层PDU首部: 计算机网络易混淆知识点串记 各层PDU首部: PUD首部长度 (B:字节)首部单位数据链路–帧帧首:14B帧尾部:4B——IPV420~60字节4B [通过4位二进制表示]IPV6固定首部40字节[可拓展]4BTCP20~60字节4BUDP8B字节

react动态路由

在React应用中&#xff0c;动态路由&#xff08;Dynamic Routing&#xff09;通常指的是根据应用的状态或用户的交互来动态地显示或隐藏路由&#xff08;页面或组件&#xff09;。这可以通过多种方法实现&#xff0c;包括使用React Router库&#xff0c;它提供了强大的路由管理…

sql中对象名称要加_的作用

‌在SQL中&#xff0c;对象名称使用下划线&#xff08;_&#xff09;的主要作用是为了提高可读性和避免命名冲突。‌ 提高可读性 使用下划线可以将对象名称分割成多个部分&#xff0c;使得名称更加清晰易读。例如&#xff0c;将user_id、employee_name等字段名使用下划线分隔…

AI与OCR:数字档案馆图像扫描与文字识别技术实现与项目案例

文末有免费工具可在线体验&#xff0c;或者网络搜索关键词“思通开源AI能力平台” 一、扫描与图像预处理 技术实现过程 在纸质档案的数字化过程中&#xff0c;首先需要使用高精度扫描仪对纸质文档进行扫描&#xff0c;生成高清的数字图像。这一步骤是整个OCR流程的基础&#xf…

(附项目源码)Java开发语言,springboot 乳腺癌术后中医健康管理APP 56,计算机毕设程序开发+文案(LW+PPT)

摘要 乳腺癌是一种常见的恶性肿瘤&#xff0c;对患者身体和心理造成了重大影响。手术是治疗乳腺癌的主要方式之一&#xff0c;术后患者需要进行长期的健康管理和康复指导。中医作为传统医学的一种&#xff0c;具有独特的辩证施治方法&#xff0c;可以在乳腺癌术后的康复过程中发…