CountDownLatch(应对并发问题的工具类)
CountDownLatch
CountDownLatch允许一个或多个线程等待其他线程完成操作以后,再执行当前线程;比如我们在主线程需要开启2个其他线程,当其他的线程执行完毕以后我们再去执行主线程,针对这
个需求我们就可以使用CountDownLatch来进行实现。CountDownLatch中count down是倒着数数的意思;CountDownLatch是通过一个计数器来实现的,每当一个线程完成了自己的
任务后,可以调用countDown()方法让计数器-1,当计数器到达0时,调用CountDownLatch的await()方法的线程阻塞状态解除,继续执行。
CountDownLatch的相关方法
public CountDownLatch(int count) // 初始化一个指定计数器的CountDownLatch对象
public void await() throws InterruptedException // 让当前线程等待
public void countDown() // 计数器进行减1
案例演示:使用CountDownLatch完成上述需求(我们在主线程需要开启2个其他线程,当其他的线程执行完毕以后我们再去执行主线程)
实现思路:在main方法中创建一个CountDownLatch对象,把这个对象作为作为参数传递给其他的两个任务线程
线程任务类1
public class CountDownLatchThread01 implements Runnable {// CountDownLatch类型成员变量private CountDownLatch countDownLatch ;public CountDownLatchThread01(CountDownLatch countDownLatch) { // 构造方法的作用:接收CountDownLatch对象this.countDownLatch = countDownLatch ;}@Overridepublic void run() {try {Thread.sleep(10000);System.out.println("10秒以后执行了CountDownLatchThread01......");} catch (InterruptedException e) {e.printStackTrace();}// 调用CountDownLatch对象的countDown方法对计数器进行-1操作countDownLatch.countDown();}}
线程任务类2
public class CountDownLatchThread02 implements Runnable {// CountDownLatch类型成员变量private CountDownLatch countDownLatch ;public CountDownLatchThread02(CountDownLatch countDownLatch) { // 构造方法的作用:接收CountDownLatch对象this.countDownLatch = countDownLatch ;}@Overridepublic void run() {try {Thread.sleep(3000);System.out.println("3秒以后执行了CountDownLatchThread02......");} catch (InterruptedException e) {e.printStackTrace();}// 调用CountDownLatch对象的countDown方法对计数器进行-1操作countDownLatch.countDown();}}
测试类
public class CountDownLatchDemo01 {public static void main(String[] args) {// 1. 创建一个CountDownLatch对象CountDownLatch countDownLatch = new CountDownLatch(2) ; // CountDownLatch中的计数器的默认值就是2// 2. 创建线程任务类对象,并且把这个CountDownLatch对象作为构造方法的参数进行传递CountDownLatchThread01 countDownLatchThread01 = new CountDownLatchThread01(countDownLatch) ;// 3. 创建线程任务类对象,并且把这个CountDownLatch对象作为构造方法的参数进行传递CountDownLatchThread02 countDownLatchThread02 = new CountDownLatchThread02(countDownLatch) ;// 4. 创建线程对象,并启动线程Thread t1 = new Thread(countDownLatchThread01);Thread t2 = new Thread(countDownLatchThread02);t1.start();t2.start();// 5. 在主线程中调用 CountDownLatch中的await让主线程处于阻塞状态try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}// 6. 程序结束的输出System.out.println("主线程执行了.... 程序结束了......");}}
控制台输出结果
3秒以后执行了CountDownLatchThread02......
10秒以后执行了CountDownLatchThread01......
主线程执行了.... 程序结束了......
CountDownLatchThread02线程先执行完毕,此时计数器-1;CountDownLatchThread01线程执行完毕,此时计数器-1;当计数器的值为0的时候,主线程阻塞状态接触,主线程向下执行。
相关文章:
CountDownLatch(应对并发问题的工具类)
CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作以后,再执行当前线程;比如我们在主线程需要开启2个其他线程,当其他的线程执行完毕以后我们再去执行主线程,针对这 个需求我们就可以使用CountDownLatch来进…...
HarmonyOS开发知识 :扩展修饰器,实现节流、防抖、权限申请
引言 防重复点击,利用装饰器面向切面(AOP)的特性结合闭包,实现节流、防抖和封装权限申请。 节流 节流是忽略操作,在触发事件时,立即执行目标操作,如果在指定的时间区间内再次触发了事件&…...
自然语言NLP的基础处理
NLP基本处理从句子的情感分析、实体与实体直接的关系,句子结构来分析 情感分析 1.句子的情感分析找出句子表达的是正面、负面还是中性的情感。 情感分析的影响因素: 词语顺序:词语的顺序可以影响句子的整体情感。例如,“我喜欢…...
带颜色的3D点云数据发布到ros1中(通过rviz显示)python、C++
ros中发布点云数据xyz以及带颜色的点云数据xyzrgb ros中发布点云数据xyz可以直接用python来做或者C(看个人偏好) ros中发布带颜色的点云数据xyzrgb环境1.新建ROS工作空间2.创建功能包 ros中发布点云数据xyz 可以直接用python来做或者C(看个人偏好) 在这里我们带有颜色的点云数…...
python学习—列表和元组
系列文章目录 python学习—合并TXT文本文件 python学习—统计嵌套文件夹内的文件数量并建立索引表格 python学习—查找指定目录下的指定类型文件 python学习—年会不能停,游戏抽签抽奖 python学习—循环语句-控制流 python学习—合并多个Excel工作簿表格文件 文章目…...
c++题目_水仙花数
水仙花数-普及-题目-ACGO题库 题目描述 求100-n中的水仙花数。一个数x,x的百位、十位、个位,分别用a、b、c来表示; 当a * a * a b * b * b c * c * c x时,x就被称为水仙花数。(n< 999) 输入格式 一行一个整数n 输出格式…...
使用 Iceberg、Tabular 和 MinIO 构建现代数据架构
现代数据环境需要一种新型的基础架构,即无缝集成结构化和非结构化数据、轻松扩展并支持高效的 AI/ML 工作负载的基础架构。这就是现代数据湖的用武之地,它为您的所有数据需求提供了一个中心枢纽。然而,构建和管理有效的数据湖可能很复杂。 这…...
jnp.linalg.norm
jnp.linalg.norm 是 JAX 中用于计算向量或矩阵的范数的函数。JAX 是一个用于高性能机器学习研究的 Python 库,它提供了与 NumPy 类似的 API,但支持自动微分和加速计算。jnp 是 JAX 的 NumPy 接口。 jnp.linalg.norm 的基本语法 jnp.linalg.norm(x, ord…...
20240621在飞凌的OK3588-C开发板的Buildroot系统中集成i2ctool工具
20240621在飞凌的OK3588-C开发板中打开i2ctool工具 2024/6/21 17:44 默认继承的i2c工具: rootrk3588-buildroot:/# rootrk3588-buildroot:/# i2c i2c-stub-from-dump i2cdump i2cset i2cdetect i2cget i2ctransfer rootrk3588-…...
ARM32开发--存储器介绍
知不足而奋进 望远山而前行 目录 文章目录 前言 存储器分类 RAM ROM EEPROM Flash 总结 前言 在现代计算机系统中,存储器扮演着至关重要的角色,不仅影响着数据的存取速度和稳定性,还直接关系到计算机系统的性能和应用场景的选择。存…...
Web服务器
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 当在浏览器输入URL后,浏览器会先请求DNS服务器,获得请求站点的 IP 地址(即根据URL地址“www.mingrisoft.com”获取…...
大语言模型-Transformer
目录 1.概述 2.作用 3.诞生背景 4.历史版本 5.优缺点 5.1.优点 5.2.缺点 6.如何使用 7.应用场景 7.1.十大应用场景 7.2.聊天机器人 8.Python示例 9.总结 1.概述 大语言模型-Transformer是一种基于自注意力机制(self-attention)的深度学习…...
POI:接收上传上来的excel,解析并导入到数据库
目录 1、控制层 2、业务层(主要逻辑) 1、控制层 因为前端设置了只能上传1个文件,这里直接取一个。 RequestMapping(value "/shebeiDaoru.ctrl", method RequestMethod.POST, produces "application/json;charsetUTF-8&q…...
网页的CSS和JavaScript文件没有自动更新, 解决办法
项目场景: 无人值守的场馆预定以及管理 问题描述 更新了CSS和JavaScript,访问始终样式不对 原因分析: 浏览器缓存了你的CSS和JavaScript文件 浏览器缓存了你的CSS和JavaScript文件。当文件的修改时间戳(last-modifiedÿ…...
Go语言 获取服务器资源磁盘Disk情况
1、获取整个磁盘的总量、已使用量、使用率 package mainimport ("fmt""github.com/shirou/gopsutil/disk""log" )func main() {// 获取所有挂载点的磁盘使用率信息partitions, err : disk.Partitions(false)if err ! nil {log.Fatalf("Err…...
使用上海云盾 CDN 和 CloudFlare 后 Nginx、 WordPress、 Typecho 获取访客真实 IP 方法
最近因为被 DDoS/CC 攻击的厉害,明月就临时的迁移了服务器,原来的服务器就空置下来了,让明月有时间对服务器进行了重置重新部署安装生产环境。因为站点同时使用了上海云盾和 CloudFlare(具体思路可以参考【国内网站使用国外 CloudFlare CDN 的思路分享】一文)两个 CDN 服务…...
深入探究RTOS的任务调度
阅读引言: 此文将会从一个工程文件, 一步一步的分析RTOS的任务调度实现, 这里选用FreeRTOS分析, 别的也差不多的, 可能在细节上有少许不一样。 目录 1, 常见嵌入式实时操作系统 2, 任务调度的…...
【shell脚本速成】函数
文章目录 一、函数1.1、函数介绍1.2、函数定义1.3、函数调用 🌈你好呀!我是 山顶风景独好 🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分使然!😊 🌸愿您在此停留的每一刻…...
拒绝零散碎片, 一文理清MySQL的各种锁
系列文章目录 学习MySQL先有全局观,细说其发展历程及特点 Mysql常用操作,谈谈排序与分页 拒绝零散碎片, 一文理清MySQL的各种锁(收藏向) 系列文章目录一、MySQL的锁指什么二、排他与共享三、全局锁(Global…...
P5711 【深基3.例3】闰年判断
1. 题目链接 https://www.luogu.com.cn/problem/P5711 P5711 【深基3.例3】闰年判断 2. 题目描述 题目描述:判断一个数是否是闰年 输入:输入一个整数n 输出:输出1或0,如果是闰年,输出1,否则输出0 3. 我的…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
