JUC常用辅助类

一、CountDownLatch

1.原理

它内部维护了一个计数器,该计数器初始化时设定一个数值,表示需要等待的线程数量。每个线程执行完特定任务后会调用CountDownLatch的countDown()方法,该方法会将计数器减一。同时,另外一个或多个线程可以通过await()方法来等待计数器变为0。一旦计数器为0,所有等待的线程就会被唤醒,继续执行。

2.主要方法

在这里插入图片描述

3.使用步骤

1.创建CountDownLatch对象,并指定需要等待的线程数量。
2.在需要等待的线程中调用await()方法进行等待。
3.在其他线程中执行任务完成后,调用countDown()方法减少计数器。

//定时计数器大小6 当计数器为0的时间就会释放所有等待线程final CountDownLatch latch = new CountDownLatch(6);for (int i = 1; i < 20; i++) {int finalI = i;new Thread(()->{if (finalI % 2 == 0){try {latch.await();} catch (InterruptedException e) {throw new RuntimeException(e);}}else {//减小计数器latch.countDown();}System.out.println(Thread.currentThread().getName() + "进门");},String.valueOf(i)).start();}try {//线程等待latch.await();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread().getName() + "出门购物");

二、CvclicRarrier

1.原理

它允许一组线程在达到一个共同的屏障点(barrier point)之前互相等待。它的工作原理是,当所有线程都到达屏障点时,所有线程被释放并继续执行。
与CountDownLatch不同,CyclicBarrier可以被重用,因为它的计数器在达到零后会被重置为初始值,并且可以在构造函数中指定一个Runnable任务,当计数器达到零时,该任务会被执行。

2.主要方法

在这里插入图片描述

3.使用步骤

1.创建CyclicBarrier对象:构造函数需要传入两个参数:参与同步的线程数量以及可选的Runnable任务(当所有线程到达屏障点时执行)
2.创建并启动参与同步的线程: 这些线程应该在某个阶段需要等待其他线程一起执行后续操作时调用CyclicBarrier的await()方法
3.等待所有线程到达屏障点: 当所有参与同步的线程都调用了await()方法后,它们会在屏障点处被阻塞,直到所有线程都到达屏障点。一旦所有线程都到达屏障点,CyclicBarrier将会执行可选的Runnable任务(如果提供了),然后释放所有被阻塞的线程继续执行后续操作。

CyclicBarrier cyclicBarrier = new CyclicBarrier(8, () -> {System.out.println("召唤神龙成功");});for (int i=1;i<8;i++){int finalI = i;new Thread(()->{System.out.println(Thread.currentThread().getName() + "收集" + finalI + "龙魂珠");try {cyclicBarrier.await();} catch (InterruptedException e) {throw new RuntimeException(e);} catch (BrokenBarrierException e) {throw new RuntimeException(e);}},String.valueOf(i)).start();}try {cyclicBarrier.await();} catch (InterruptedException e) {throw new RuntimeException(e);} catch (BrokenBarrierException e) {throw new RuntimeException(e);}System.out.println("孙悟空开始许愿!!!");

三、Semaphore

1.原理

一种用于控制对共享资源的访问的同步原语。它可以用于限制同时访问某一资源的线程数量,或者用于在多个线程之间进行流量控制。
acquire(): 当一个线程希望访问共享资源时,它需要调用 acquire() 方法来获取信号量。如果当前信号量计数为正,则线程可以继续执行,并且信号量计数减一;如果当前计数为零,则线程会被阻塞,直到有其他线程释放信号量。
release(): 当一个线程完成对共享资源的访问时,它需要调用 release() 方法来释放信号量。这会将信号量计数加一,并且唤醒等待的线程。

2.主要方法

在这里插入图片描述

3.使用步骤(可以作用于限流)

1.创建 Semaphore 对象:创建一个 Semaphore 对象。在创建 Semaphore 对象时,您需要指定信号量的初始数量,这决定了能够同时访问共享资源的线程数量。
2.获取信号量:当一个线程希望访问共享资源时,它需要调用 acquire() 方法来获取信号量。如果当前信号量计数为正,则线程可以继续执行,并且信号量计数减一;如果当前计数为零,则线程会被阻塞,直到有其他线程释放信号量。
3.访问共享资源:一旦线程成功获取了信号量,它就可以访问共享资源了。在这个阶段,线程可以执行需要访问共享资源的操作。
4.释放信号量:当一个线程完成对共享资源的访问时,它需要调用 release() 方法来释放信号量。这会将信号量计数加一,并且唤醒等待的线程。

//线程数量 三个停车位
Semaphore semaphore = new Semaphore(3);
//六辆车
for (int i = 1; i < 7; i++) {new Thread(()->{//acquire() 获取车位try {semaphore.acquire();System.out.println(Thread.currentThread().getName() + "找到停车位");TimeUnit.SECONDS.sleep(2);System.out.println(Thread.currentThread().getName() + "离开停车位");} catch (InterruptedException e) {throw new RuntimeException(e);} finally {//release()释放 离开车位 只有释放才可以让其他线程进入semaphore.release();}},String.valueOf(i)).start();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/807692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Acrel-1000DP光伏监控系统 的应用 安科瑞 许敏

摘 要&#xff1a;分布式光伏发电特指在用户场地附近建设&#xff0c;运行方式多为自发自用&#xff0c;余电上网&#xff0c;部分项目采用全额上网模式。分布式光伏全额上网的优点是可以充分利用分布式光伏发电系统的发电量&#xff0c;提高分布式光伏发电系统的利用率。发展分…

题目 2348: 信息学奥赛一本通T1436-数列分段II【二分答案】

信息学奥赛一本通T1436-数列分段II - C语言网 (dotcpp.com) #include<iostream> #include<algorithm> #include<cstring> using namespace std; #define int long long const int N1e5100; const int inf1e9; int n,m; int a[N]; bool check(int mid) {int s…

ELK、ELKF企业级日志分析系统介绍

前言 随着企业级应用系统日益复杂&#xff0c;随之产生的海量日志数据。传统的日志管理和分析手段&#xff0c;难以做到高效检索、实时监控以及深度挖掘潜在价值。在此背景下&#xff0c;ELK日志分析系统应运而生。"Elastic" 是指 Elastic 公司所提供的一系列与搜索…

总体标准差、样本标准差、标准误(标准误差)

下面是样例&#xff1a; 参考文章如何做好SCI论文中的标准误差图 - 知乎 (zhihu.com)

第十四篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python自动化处理图像

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、Python自动化图像处理的优点介绍二、Python常用图像处理库和功能介绍三、强大且易于上手示例代码四、丰富的算法资源示例代码五、批量处理图片示例代码六、支持多种图像格式示例代码七、…

【LeetCode】单调栈类题目详解

所有题目均来自于LeetCode&#xff0c;刷题代码使用的Python3版本 单调栈 通常针对一维数组的问题&#xff0c;如果需要寻找一个元素右边或者左边第一个比自己大或者小的元素的位置&#xff0c;就可以使用单调栈&#xff0c;时间复杂度为O(n) 单调栈的本质是空间换时间&#…

Linux内核中常用的C语言技巧

Linux内核采用的是GCC编译器&#xff0c;GCC编译器除了支持ANSI C&#xff0c;还支持GNU C。在Linux内核中&#xff0c;许多地方都使用了GNU C语言的扩展特性&#xff0c;如typeof、__attribute__、__aligned、__builtin_等&#xff0c;这些都是GNU C语言的特性。 typeof 下面…

如何使用Jellyfin+cpolar低成本部署私人影音平台并实现无公网IP远程访问

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

AI大模型之ChatGPT科普(深度好文)

目录 训练ChatGPT分几步&#xff1f; 如何炼成ChatGPT&#xff1f; 如何微调ChatGPT? 如何强化ChatGPT? 如何调教ChatGPT? AI思维链是什么&#xff1f; GPT背后的黑科技Transformer是什么&#xff1f; Transformer在计算机视觉上CV最佳作品&#xff1f; 数字时代&am…

【MySQL】游标和触发器

一、游标 1.1 什么是游标 1、使用背景 在我们使用update或者delete操作数据时&#xff0c;一般都会根据条件语句查询出很多条记录组成的数据集&#xff0c;然后一次性批量操作 假设我们想要对这个结果集中的数据 一行一行的进行操作&#xff0c;比如某个条件满足后&#xff…

Lora 串口透传开发 5

1 简介 串口转usb、转wifi等很多应用 2 设计原理 2.1 设计需求 1将LoRa终端定义成两种角色:Master和Slave 2一个模块发送任意字节长度&#xff08;小于128Byte&#xff09;数据&#xff0c;另一模块都可以接收到 3PC机上通过串口调试助手实现接收和发送 4终端在LCD屏幕上显…

智慧公厕升级为多功能城市智慧驿站,助力智慧城市发展

在现代城市的建设中&#xff0c;公共厕所作为基础必备的民生设施&#xff0c;一直是城市管理的重要组成部分。随着科技的不断发展&#xff0c;智慧公厕应运而生&#xff0c;成为了公共厕所信息化、数字化、智慧化的应用解决方案。而近年来&#xff0c;智慧公厕也进行了升级发展…

损失函数:BCE Loss(二元交叉熵损失函数)、Dice Loss(Dice相似系数损失函数)

损失函数&#xff1a;BCE Loss&#xff08;二元交叉熵损失函数&#xff09;、Dice Loss&#xff08;Dice相似系数损失函数&#xff09; 前言相关介绍BCE Loss&#xff08;二元交叉熵损失函数&#xff09;代码实例直接计算函数计算 Dice Loss&#xff08;Dice相似系数损失函数&a…

分布式 SpringCloudAlibaba、Feign与RabbitMQ实现MySQL到ES数据同步

文章目录 ⛄引言一、思路分析⛅实现方式⚡框架选择 二、实现数据同步⌚需求分析⏰搭建环境⚡核心源码 三、测试四、源码获取⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助…

如何使用Android手机通过JuiceSSH远程访问本地Linux服务器

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

Python上解决TypeError: not all arguments converted during string formatting错误

目录 背景尝试1: pymysql模块的escape_string方法尝试2: 修改pandas.read_excel引擎尝试3: 回退xlrd版本总结 背景 在Linux上部署的时候, 使用pandas模块读取Excel, 然后pymysql模块入库, 结果发生了错误 Traceback (most recent call last):File "/usr/local/lib64/pyth…

3月谷歌应用上架/下架情况,上架难度加大,开发者面临新挑战?

在3月份&#xff0c;Google play应用商店应用上架和下架出现了前所未有的情况。很多开发者表示&#xff0c;上架难度简直是“地狱”级别。 下图是3月份美国、巴西、印度、中国香港的下架数量的折线图&#xff0c;根据市场数据监测&#xff0c;可以清晰地看到3月份中旬之后&…

DESTINATION MOON 香港站回顾|聆听 Web3 创新者的未来对话

创新者汇聚 Web3 行业&#xff0c;如何才能在生态、技术、投资的发展新风口把握机遇&#xff1f;「TinTin Destination Moon」香港站活动于 4 月 6 日下午如期举行&#xff01;Web3AI 的融合发展之道在哪&#xff1f;ETF 时代的投资逻辑有哪些&#xff1f;区块链未来的关键究竟…

使用HTML+CSS实现一个简单的登录页面

整个项目使用文件&#xff1a; HTML代码部分&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><ti…

如何理解单片机 pwm 控制的基本原理?

单片机PWM&#xff08;脉宽调制&#xff09;控制的基本原理&#xff0c;简而言之&#xff0c;就是通过改变脉冲信号的宽度&#xff08;占空比&#xff09;来控制模拟电路。这涉及到单片机生成一系列脉冲信号&#xff0c;每个脉冲信号的高电平持续时间和整个周期的比值&#xff…