JavaEE(系列16) -- 多线程(信号量与CountDownLatch)
目录
1. 信号量Semaphore
2. CountDownLatch
1. 信号量Semaphore
信号量, 用来表示 "可用资源的个数". 本质上就是一个计数器.
1.理解信号量
可以把信号量想象成是停车场的展示牌: 当前有车位 100 个. 表示有 100 个可用资源.当有车开进去的时候, 就相当于申请一个可用资源, 可用车位就 -1 (这个称为信号量的 P 操作)当有车开出来的时候, 就相当于释放一个可用资源, 可用车位就 +1 (这个称为信号量的 V 操作)如果计数器的值已经为 0 了, 还尝试申请资源, 就会阻塞等待, 直到有其他线程释放资源.
Semaphore 的 PV 操作中的加减计数器操作都是原子的, 可以在多线程环境下直接使用.
2. 代码示例
- 创建 Semaphore 示例, 初始化为 4, 表示有 4 个可用资源.
- acquire 方法表示申请资源(P操作), release 方法表示释放资源(V操作)
- 创建 20 个线程, 每个线程都尝试申请资源, sleep 1秒之后, 释放资源. 观察程序的执行效果.
package SemaphoreTest;import java.util.concurrent.Semaphore;public class SemaphoreTest {public static void main(String[] args) {// 1.创建信号量 表示有4个可用资源Semaphore semaphore = new Semaphore(4);// 2.创建一个可以执行的任务Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("申请资源");try {semaphore.acquire();System.out.println("我获取到资源了");Thread.sleep(1000);System.out.println("我释放资源了");semaphore.release();} catch (InterruptedException e) {throw new RuntimeException(e);}}};for (int i = 0; i < 20; i++) {Thread thread = new Thread(runnable);thread.start();}} }
2. CountDownLatch
CountDownLatch: 同时等待 N 个任务执行结束.
好像跑步比赛,10个选手依次就位,哨声响才同时出发;所有选手都通过终点,才能公布名次成绩。
- 构造 CountDownLatch 实例, 初始化 10 表示有 10 个任务需要完成.
- 每个任务执行完毕, 都调用 latch.countDown() . 在 CountDownLatch 内部的计数器同时自减.
- 主线程中使用 latch.await(); 阻塞等待所有任务执行完毕. 相当于计数器为 0 了.
import java.util.Map;
import java.util.Random;
import java.util.concurrent.CountDownLatch;public class CountDownLatchTest {public static void main(String[] args) throws InterruptedException {CountDownLatch latch = new CountDownLatch(4);Runnable runnable = new Runnable() {@Overridepublic void run() {try {Thread.sleep((int)(Math.random() * 10000));latch.countDown();} catch (InterruptedException e) {throw new RuntimeException(e);}}};for (int i = 0; i < 4; i++) {Thread thread = new Thread(runnable);thread.start();}latch.await();System.out.println("结束");}
}
相关文章:
JavaEE(系列16) -- 多线程(信号量与CountDownLatch)
目录 1. 信号量Semaphore 2. CountDownLatch 1. 信号量Semaphore 信号量, 用来表示 "可用资源的个数". 本质上就是一个计数器. 1.理解信号量 可以把信号量想象成是停车场的展示牌: 当前有车位 100 个. 表示有 100 个可用资源.当有车开进去的时候, 就相当于申请一个可…...
Tomcat配置https协议证书-阿里云,Nginx配置https协议证书-阿里云,Tomcat配置https证书pfx转jks
Tomcat/Nginx配置https协议证书 前言Tomcat配置https协议证书-阿里云方式一 pfx配置证书重启即可 方式二 jkspfx生成jks配置证书重启即可 Nginx配置https协议证书-阿里云实现方式重启即可 其他Tomcat相关配置例子如下nginx配置相关例子如下 前言 阿里云官网:https:…...
抖音定位基本原理
抖音是一款非常受欢迎的短视频分享应用程序,它允许用户创建和分享15秒到60秒的短视频。抖音的成功在很大程度上归功于其强大的定位技术,该技术可以根据用户的兴趣和位置提供个性化的内容。在本文中,我们将深入探讨抖音的定位技术,…...
【Hbase 05】Hbase表的设计原则与优化方案
这里说一下Hbase在使用过程中的表设计原则与优化方案,如果你是运维或者开发兼顾环境的工作,也许比较受用,话不多说,我们直接开始说优化的内容: 一、表设计原则 1.行键设计 行键在设计的时候要尽量的散列,例如可以考虑使用哈希、加密算法等使结果散列,这样能保证请求不会…...
行业报告 | 2022文化科技十大前沿应用趋势(上)
文 | BFT机器人 前言 Introduction 文化科技是文化科技融合过程中诞生的系列新技术成果,是文化强国和科技强国两大战略的交又领域。2012 年 8月,科技部会同中宣部、财政部、文化部、广电总局、新闻出版总署发布《文化科技创新工程纲要》,开启…...
实现BIM的Revit软件学习资料
实现BIM的Revit软件学习资料 一、BIM与Revit的关系二、Revit使用方法总结(一)快捷键(二)一些技巧 一、BIM与Revit的关系 链接: BIM与Revit是什么关系?看完秒懂系列! REVIT是实现BIM理念的工具之一。 二、Revit使用方…...
09 集合框架2
集合元素的迭代方式有哪些? for循环,for-each循环(底层迭代器),迭代器 Iterator<String> it list.iterator(); while(it.hasNext()) {String ele it.next();System.out.println(ele); }并发修改集合元素异常是怎么造成的?怎么解决? 在迭代过程中使用List里面的增…...
相见恨晚的5款良心软件,每款都是经过时间检验的精品
今天来给大家推荐5款良心软件,每款都是经过时间检验的精品,用起来让你的工作效率提升飞快,各个都让你觉得相见恨晚! 1.颜色选择器——ColorPicker ColorPicker是一款用于在屏幕上选择颜色的工具。它可以让你快速地获取任意像素的颜色值,并复制到剪贴板…...
AI与税务管理:新技术带来的新机遇和新挑战
本文作者:王伊琳 人工智能(Artificial Intelligence,AI)是指由计算机系统或机器人模拟人类智能的过程和结果,包括感知、理解、学习、推理、决策等能力。近年来,随着计算机技术、互联网平台、大数据分析等的…...
springboot 集成 Swagger3(速通)
→ springboot 集成 Swagger2 ← 目录 1. 案例2. info 配置3. Docket 配置1. 开关配置2. 扫描路径3. 路径匹配4. 分组管理 4. 常用注解1. 说明2. 案例 1. 案例 这次直接使用 2.5.6 的 spring-boot 。 依赖: <parent><groupId>org.springframework.…...
2023年NOC大赛创客智慧编程赛项图形化复赛模拟题二,包含答案解析
2023年NOC大赛创客智慧编程赛项图形化复赛模拟题二,包含答案解析 第一题: 在源程序“小蝙蝠”文件中,实现小蝙蝠遇到不同的角色会说不同的话,以及切换不同的造型要求: 1:游戏开始时,小蝙蝠角色是造型 a,并能够用键盘控制上、下、左、右移动; 2:移动小蝙蝠,距离角色雪…...
2023年NOC大赛创客智慧编程赛项Python 复赛模拟题(二)
题目来自:NOC 大赛创客智慧编程赛项Python 复赛模拟题(二) NOC大赛创客智慧编程赛项Python 复赛模拟题(二) 第一题: 编写一个成绩评价系统,当输入语文、数学和英语三门课程成绩时,输出三门课程总成绩及其等级。 (1)程序提示用户输入三个数字,数字分别表示语文、数学、…...
【SQL】MySQL的查询语句
文章目录 SELECT语句WHERE子句JOIN语句GROUP BY和HAVINGORDER BYLIMIT其他关键字 MySQL是一种广泛使用的关系型数据库管理系统,它被广泛地应用于各种应用程序和网站。学会使用MySQL的查询语句可以帮助我们更好地管理和分析数据,从而更好地利用数据库中的…...
测试的分类
1 按照开发阶段(软件开发周期) 单元测试是对软件的组成单元进行测试。其目的是检验软件基本组成单位的正确性。测试的对象是软件设计的最小单位——模块,故又称为模块测试。集成测试是将程序模块采用适当的集成策略组装起来,对系…...
【5.21】六、自动化测试—持续集成测试
目录 6.4 持续集成测试 6.4.1 持续集成的概念 6.4.2 持续集成测试框架设计 6.4 持续集成测试 持续集成(Continuous Integration,CI)是软件开发DevOps(DevelopmentOperations)中的一个概念,它强调的是软…...
【C++】 排列与组合算法详解(进阶篇)
文章目录 写在前面算法1:朴素算法思路缺点 算法2:递推预处理思路时间复杂度: O ( n 2 ) O(n^2) O(n2) 算法3:阶乘逆元思路时间复杂度: O ( n log n ) O(n \log n) O(nlogn)思考:读者也可以尝试写 O ( n…...
Godot引擎 4.0 文档 - 循序渐进教程 - 监听玩家输入
本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面: Listening to player input — Godot Engine (stable) documentation in English 监听玩家输入 在上一课创建您的第一个脚本的基础上,让我们看看任何游戏…...
Docker笔记9 | Docker中网络功能知识梳理和了解
9 | Docker中网络功能知识梳理和了解 1 外部访问容器1.1 访问方式1.2 映射所有接口地址1.3 映射到指定地址的指定端口1.4 映射到指定地址的任意端口1.5 查看映射端口配置 2 容器互联2.1 新建网络2.2 连接容器 3 配置DNS 简单说:Docker 允许通过外部访问容器或容器互…...
生态系统模型:SolVES、DNDC、CMIP6、GEE林业、APSIM、InVEST、无人机遥感、ArcGIS Pro模型等
基于R语言APSIM模型高级应用及批量模拟实践技术 CMIP6 数据处理方法与典型案例分析实践技术 Python 与 Noah-MP 陆面过程模型融合技术及在站点、区域模拟实践应用 双碳目标下基于“遥感”融合技术在碳储量、碳收支、碳循环等多领域监测与模拟实践应用 基于Citespace和vosvi…...
常见分布函数。
一维常见分布函数 1.离散型 ① 0 - 1分布 记 X~B(1,p) 如果X的概率分布为 ( 1 0 p 1 − p ) \begin{pmatrix} 1 & 0 \\ p & 1-p \end{pmatrix} (1p01−p),则称X服从参数为P的0-1分布(0<p<1)。 注:0-1分布又称一次伯努利试…...
Win11Debloat:通过系统精简与优化实现Windows性能提升的自动化方案
Win11Debloat:通过系统精简与优化实现Windows性能提升的自动化方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to decl…...
ChromeDriver vs GeckoDriver终极选择指南:如何为php-webdriver项目挑选最佳浏览器驱动
ChromeDriver vs GeckoDriver终极选择指南:如何为php-webdriver项目挑选最佳浏览器驱动 【免费下载链接】php-webdriver PHP client for Selenium/WebDriver protocol. Previously facebook/php-webdriver 项目地址: https://gitcode.com/gh_mirrors/ph/php-webdr…...
Cylinder3D目标检测环境配置、Cylinder3D目标检测模型代跑训练、Cylinder3D目标检测模型改进创新Cylinder3D目标检测环境配置:Windows、Ubuntu、Cen
Cylinder3D目标检测环境配置、 Cylinder3D目标检测模型代跑训练、 Cylinder3D目标检测模型改进创新 Cylinder3D目标检测环境配置:Windows、Ubuntu、Centos、Macos等系统环境,如果电脑拥有显卡,可配置GPU版本的Cylinder3D环境。 Cylinder3D目标…...
Spoon安全测试实践:权限授予与数据清理的最佳方案
Spoon安全测试实践:权限授予与数据清理的最佳方案 【免费下载链接】spoon Distributing instrumentation tests to all your Androids. 项目地址: https://gitcode.com/gh_mirrors/sp/spoon Spoon是Square公司开发的一款强大的Android仪器化测试分发工具&…...
3步重塑邮件体验:Markdown Here如何让技术沟通更优雅
3步重塑邮件体验:Markdown Here如何让技术沟通更优雅 【免费下载链接】markdown-here Google Chrome, Firefox, and Thunderbird extension that lets you write email in Markdown and render it before sending. 项目地址: https://gitcode.com/gh_mirrors/ma/m…...
告别野火原子,用江科大STM32F103模板+Keil5,30分钟搞定RT-Thread Nano 3.0.3移植
江科大STM32F103模板Keil5快速移植RT-Thread Nano 3.0.3实战指南 如果你正在使用江科大的STM32F103教学模板,想要快速实现RT-Thread Nano 3.0.3的移植,这篇文章将为你提供一个30分钟完成的详细方案。相比野火、正点原子等开发板,江科大模板在…...
MT5 Zero-Shot中文文本增强企业应用:提升标注效率50%实测报告
MT5 Zero-Shot中文文本增强企业应用:提升标注效率50%实测报告 1. 引言:当数据标注成为AI落地的瓶颈 想象一下这个场景:你的AI团队开发了一个智能客服模型,需要大量高质量的对话数据进行训练。数据工程师们夜以继日地标注数据&am…...
新手福音:通过快马生成wsl2入门项目,轻松迈出linux开发第一步
作为一个刚接触Linux开发的新手,我最近在尝试使用WSL2搭建开发环境时遇到了不少麻烦。从安装配置到基础命令学习,每一步都让我这个Windows用户感到手足无措。直到发现了InsCode(快马)平台,它帮我生成了一套完整的WSL2入门项目,让我…...
告别联网烦恼:uv离线安装科学计算包的3种实战姿势(NumPy/TensorFlow实测)
数据科学家必备:三种高效离线安装Python科学计算包的终极方案 实验室的服务器突然断网了,而你的TensorFlow模型训练正进行到关键时刻——这种场景对数据科学家来说简直是噩梦。别担心,离线安装Python包并非无解难题。本文将带你掌握三种经过实…...
Simulink AUTOSAR实战:从模型信号到RTE接口的完整映射流程解析
Simulink AUTOSAR实战:从模型信号到RTE接口的完整映射流程解析 在汽车电子软件开发领域,AUTOSAR标准已经成为行业通用架构,而Simulink作为模型化开发的主流工具,如何实现两者无缝衔接是每个汽车软件工程师必须掌握的技能。本文将带…...
