【线程】wait()+notifyAll()实现多个线程交替遍历,输出ABCABC
背景
有三个线程,每个线程分别循环输出A、B、C,各线程循环10次,要求输出结果是ABCABCABC这样的
代码
@Data
public class PrintThread extends Thread {private String string; // 输出的字符串private int order; // 输出的顺序private static Object lock; // 静态锁对象private static volatile int index = 0; // 共享的索引变量public PrintThread(String string, int order, Object lock) {this.string = string;this.order = order;this.lock = lock;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {synchronized (lock) { // 使用锁对象进行同步while (index % 3 != order) { // 判断是否轮到当前线程输出try {lock.wait(); // 如果不是轮到当前线程输出,则释放锁并等待} catch (InterruptedException e) {e.printStackTrace();}}try {Thread.sleep(10); // 模拟输出过程的耗时操作} catch (InterruptedException e) {e.printStackTrace();}index++; // 修改索引变量,表示下一个线程可以输出了System.out.println(string); // 输出字符串lock.notifyAll(); // 唤醒其他等待的线程}}}public static void main(String[] args) {try {Object lock = new Object(); // 创建锁对象PrintThread threadA = new PrintThread("A", 0, lock); // 创建线程APrintThread threadB = new PrintThread("B", 1, lock); // 创建线程BPrintThread threadC = new PrintThread("C", 2, lock); // 创建线程CthreadA.start(); // 启动线程AthreadB.start(); // 启动线程BthreadC.start(); // 启动线程C} catch (Exception e) {e.printStackTrace();}}
}
最后
实际会有这样的场景吗?下面举几个例子
1、假设在一个食堂,有很多人在排队打饭,每个人需要完成以下步骤:先拿餐具,然后拿菜,再拿饭,最后付钱。
2、多线程下载器。当我们下载一个大文件时,可以使用多个线程同时从不同的服务器上下载文件的不同部分,然后将这些部分合并成一个完整的文件。通过多个线程交替遍历不同的服务器,可以提高下载速度,加快文件的下载过程。
3、医院的门诊、机场的登机口、超市的收银台等等。
扩展
除了wait+notifyAll,还有其他的实现方式
-
使用
CountDownLatch
:CountDownLatch
是一个同步辅助类,可以用于控制一个或多个线程等待其他线程完成操作。它通过一个计数器来实现,线程调用await()
方法等待计数器变为0,而其他线程调用countDown()
方法来减少计数器的值。当计数器变为0时,等待的线程将被唤醒。 -
使用
CyclicBarrier
:CyclicBarrier
也是一个同步辅助类,可以用于多个线程之间的同步。它和CountDownLatch
类似,都是通过计数器来实现线程的等待和唤醒。不同之处在于,CyclicBarrier
的计数器可以重复使用,当计数器减为0时,所有等待的线程都会被唤醒,并且计数器会被重置为初始值。 -
使用
Semaphore
:Semaphore
是一个计数信号量,可以用来控制同时访问某个资源的线程个数。它维护了一个许可证的计数器,线程可以通过acquire()
方法获取许可证,如果计数器大于0,线程可以继续执行;如果计数器为0,线程将被阻塞。线程在使用完资源后,需要调用release()
方法释放许可证,使得其他线程可以继续访问资源。 -
使用
Lock
和Condition
:Lock
是一个可重入的互斥锁,可以用来替代synchronized
关键字实现线程的同步。Condition
是与Lock
相关联的条件对象,可以用来实现线程的等待和唤醒。线程可以通过调用await()
方法等待条件满足,而其他线程可以通过调用signal()
或signalAll()
方法来唤醒等待的线程。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
【线程】wait()+notifyAll()实现多个线程交替遍历,输出ABCABC
背景 有三个线程,每个线程分别循环输出A、B、C,各线程循环10次,要求输出结果是ABCABCABC这样的 代码 Data public class PrintThread extends Thread {private String string; // 输出的字符串private int order; …...
![](https://img-blog.csdnimg.cn/946277a8274147ffa5faae605b404128.png)
MyBatis 缓存机制复习及项目中的应用经历
背景 想起前两年工作中因为二级缓存默认开启导致的问题,完整的看了一个介绍 MyBatis 缓存机制的视频《MyBatis 缓存基础知识讲解》。 总计知识点: 缓存的类型及开关这是个形同虚设的功能,线上环境应该禁用缓存 MyBatis 缓存分类 MyBasit…...
![](https://img-blog.csdnimg.cn/b9f9dd08a9fc46348eddf0f6cd86c8fe.png#pic_center)
匈牙利算法详解
匈牙利算法(Hungarian Algorithm)是一种组合优化算法(combinatorial optimization algorithm),用于求解指派问题(assignment problem),算法时间复杂度为O(N^3)。Harold Kuhn发表于1955年,由于该算法基于两位匈牙利数学家的早期研究成果&#…...
![](https://www.ngui.cc/images/no-images.jpg)
script的三种加载模式
默认加载:阻断dom树构建(html文档解析),下载资源,然后立即执行,完毕后再进行dom树构建defer 加载:下载照旧,但执行延后。即下载资源和dom构建同时进行,但等dom树构建完再执行async:下…...
![](https://www.ngui.cc/images/no-images.jpg)
mongo 中两张表联合查询
表1:user 表 表2:dept表 需要查询user表中roleCodes 包含shr 的数据 然后联合dept表 需要部门名称 db.user.aggregate([{$match: {roleCodes: "shr" // 匹配roleCodes包含"shr"的文档}},{$lookup: {from: "dept", // 关联的集合名称loc…...
![](https://img-blog.csdnimg.cn/5d0cb392275448c98b4cad00d33e1ee4.png)
【Linux】多路转接 -- epoll
文章目录 1. 认识epoll2. epoll相关系统调用接口3. epoll工作原理4. epoll服务器5. epoll的优点6. epoll的工作方式7. epoll的使用场景 1. 认识epoll epoll系统调用和select以及poll是一样的,都是可以让我们的程序同时监视多个文件描述符上的事件是否就绪。 epoll…...
![](https://img-blog.csdnimg.cn/e0ba10c4112e4452b5edfb4f2e13ae86.png)
学会RabbitMQ的延迟队列,提高消息处理效率
系列文章目录 手把手教你,本地RabbitMQ服务搭建(windows) 消息队列选型——为什么选择RabbitMQ RabbitMQ灵活运用,怎么理解五种消息模型 RabbitMQ 能保证消息可靠性吗 推或拉? RabbitMQ 消费模式该如何选择 死信是什么…...
![](https://img-blog.csdnimg.cn/img_convert/c0ae132207dc9e4005609784100dfe2d.jpeg)
ChatGPT会取代搜索引擎吗?BingChat、GoogleBard与ChatGPT区别
目前暂时不会,ChatGPT为代表的聊天机器人很可能会直接集成到搜索中,而不是取代它。微软已经通过Bing Chat和Bing做到了这一点,它将“聊天”选项卡直接放入Bing搜索的菜单中。Google、百度也分别开始尝试通过其AI生成技术将Google Bard、文心一…...
![](https://img-blog.csdnimg.cn/b5774bf9eb8e4b8e87ff256749e57f5f.png)
多个QLabel中文字左右对其问题研究
众所周知,关于QLabel 中的文字对其方式,官方提供多种,具体可参考 AlignmentFlag,这里就不详细列举了。 实际开发中有这样一个需求:多个lab中,文字显示不同,长度不一,但想要实现视觉…...
![](https://img-blog.csdnimg.cn/e984877dca8347a392deb5c6bd1ff90d.png)
链式二叉树统计结点个数的方法和bug
方法一: 分治:分而治之 int BTreeSize1(BTNode* root) {if (root NULL) return 0;else return BTreeSize(root->left)BTreeSize(root->right)1; } 方法二: 遍历计数:设置一个计数器,对二叉树正常访问&#…...
![](https://www.ngui.cc/images/no-images.jpg)
C语言-报错集锦-03-malloc(): memory corruption: 0x0000000001496d90 ***
一、报错信息 [2023-8]--[ Debug ]--Push Data To StAccessPath OK. [2023-8]--[ Debug ]--Judge Vertex(0) Is Not Accessed. [2023-8]--[ Debug ]--Judge Vertex(2) Is Accessed. [2023-8]--[ Debug ]--Judge Vertex(3) Is Not Accessed. [2023-8]--[ Debug ]--Judge Vertex…...
![](https://img-blog.csdnimg.cn/img_convert/f46c7560c08b7f26b56dea060fd761e4.png)
现代C++中的从头开始深度学习:【5/8】卷积
一、说明 在上一个故事中,我们介绍了机器学习的一些最相关的编码方面,例如 functional 规划、矢量化和线性代数规划。 现在,让我们通过使用 2D 卷积实现实际编码深度学习模型来开始我们的道路。让我们开始吧。 二、关于本系列 我们将学习如何…...
![](https://img-blog.csdnimg.cn/ff2ba41b868846b080d1f3424280040d.png)
以太网帧格式与吞吐量计算
以太网帧结构 帧大小的定义 以太网单个最大帧 6(目的MAC地址) 6(源MAC地址) 2(帧类型) 1500{IP数据包[IP头(20)DATA(1480)]} 4(CRC校验ÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
vue中install方法
1:语法 vue提供install可供我们开发新的插件及全局注册组件等 install方法第一个参数是vue的构造器,第二个参数是可选的选项对象 export default {install(Vue,option){组件指令混入挂载vue原型} }2:注册组件 一:注册单个组件 1…...
![](https://img-blog.csdnimg.cn/72512fd565fb4139b600a06a465db10c.gif)
Flutter:文件读取—— video_player、chewie、image_picker、file_picker
前言 简单学习一下几个比较好用的文件读取库 video_player 简介 用于视频播放 官方文档 https://pub-web.flutter-io.cn/packages/video_player 安装 flutter pub add video_player加载网络视频 class _MyHomePageState extends State<MyHomePage> {// 控制器late…...
![](https://www.ngui.cc/images/no-images.jpg)
vim的使用
vim文本编辑器 vim介绍命令模式光标移动选中内容复制内容粘贴内容删除撤销/恢复字符转换 编辑模式末行模式保存/退出查找行号显示文件切换 扩展 vim介绍 vim是Linux自带的文本编辑器,具有命令模式、编辑模式、末行模式三种模式。 模式间的切换: 命令模…...
![](https://img-blog.csdnimg.cn/078a2b179e614dcfac497fda183e427f.png)
马氏杆法检查斜视
使用 检查水平向斜视时,使用水平向马氏杆检查;重直向斜视时,使用重直问马氏杆;检查旋转斜视时,使用双马氏杆. 检查水平向斜视 双眼屈光不正全矫 双眼同时打开,右眼前加水平向马氏杆,左眼前不加 双眼同时观察点光源&…...
![](https://img-blog.csdnimg.cn/img_convert/ab913095c7ddfdacf3386ba64eeff451.jpeg)
Mac电脑怎么使用“磁盘工具”修复磁盘
我们可以使用“磁盘工具”的“急救”功能来查找和修复磁盘错误。 “磁盘工具”可以查找和修复与 Mac 磁盘的格式及目录结构有关的错误。使用 Mac 时,错误可能会导致意外行为,而重大错误甚至可能会导致 Mac 彻底无法启动。 继续之前,请确保您…...
![](https://img-blog.csdnimg.cn/a4d232268c2f4656ae285740e3403e96.png)
c++画出分割图像,水平线和垂直线
1、pca 找到图像某个区域的垂直线,并画出来 // 1、 斑块的框 血管二值化图,pca 找到垂直血管壁的直线, 还是根据斑块找主轴方向吧// Step 1: 提取斑块左右范围内的血管像素点坐标,std::vector<cv::Point> points;for (int y 0; y <…...
![](https://www.ngui.cc/images/no-images.jpg)
Python 程序设计入门(015)—— enumerate() 函数的用法
Python 程序设计入门(015)—— enumerate() 函数的用法 目录 Python 程序设计入门(015)—— enumerate() 函数的用法一、enumerate() 函数的语法二、为可迭代对象创建索引三、将字符串、列表等转换为字典1、将字符串转换为字典2、…...
![](https://www.ngui.cc/images/no-images.jpg)
__dict__属性
__dict__ 是 Python 中的一个特殊属性,通常存在于大多数 Python 对象中,用于存储该对象的可变属性。 以下是关于 __dict__ 的一些关键点和详细信息: 存储属性:对于大多数自定义的 Python 对象,__dict__ 属性包含了这个…...
![](https://img-blog.csdnimg.cn/d2e3349bfef640ce95940cbaab8995de.png)
k8s之Pod控制器
目录 一、Pod控制器及其功用二、pod控制器的多种类型2.1 pod容器中的有状态和无状态的区别 三、Deployment 控制器四、SatefulSet 控制器4.1 StatefulSet由以下几个部分组成4.2 为什么要有headless?4.3 为什么要有volumeClaimTemplate?4.4 滚动更新4.5 扩…...
![](https://www.ngui.cc/images/no-images.jpg)
逆元(求乘法逆元的几种方法)
目录 逆元 加法逆元 乘法逆元 如何求 快速幂 扩展欧几里得 O(n)求1到n的乘法逆元 逆元 数学中,逆元素(英语:Inverse element)推广了加法中的加法逆元和乘法中的倒数。直观地说,它是一个可以取消另一给定元素运…...
![](https://www.ngui.cc/images/no-images.jpg)
没点本事,还真做不好数字化转型
数字化转型逐渐成为企业业务增长的利器 然而,在此过程中 企业最应该注重哪些? 效率?质量? 但还有一个至关重要的点不容忽视 那就是安全 有一家硬核企业通过技术与狠活 硬生生提升了应用安全性 保障了产业与数字化的安全融合…...
![](https://img-blog.csdnimg.cn/99e9cf1071fa4b3cb76b2887db2d4e8a.png)
windows 10 远程桌面配置
1. 修改远程桌面端口(3389) 打开注册表(winr), 输入regedit 找到配置项【计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Server\Wds\rdpwd\Tds\tcp】 , 可以通过搜索“Wds”快速定位。 修改端口配…...
![](https://www.ngui.cc/images/no-images.jpg)
OpenStreetMap 上基于A*搜索算法的C ++路线规划项目
引言 在现代的地理信息系统(GIS)中,路线规划是一个重要的组成部分。它涉及到从一个地点到另一个地点的最优路径的确定。在这篇文章中,我们将探讨如何在OpenStreetMap数据上实现一个基于A*搜索算法的C路线规划项目。 OpenStreetM…...
![](https://img-blog.csdnimg.cn/ab659292ccc649eea670327cae9e2613.png)
java实现随机生成验证码
import java.util.concurrent.ThreadLocalRandom;/* 生成验证码的工具 可动态配置验证码长度*/ public class CodeUtils {public static void main(String[] args) {//随机生成5个长度为4的验证码for (int i 0; i < 5; i) {System.out.println(CodeUtils.getCode(4));}for …...
Positive证书是什么?
Positive SSL是全球著名CA Sectigo的子品牌, 也是目前全球签发量最高的商业SSL证书。价格低,安全性高,在个人网站和中小型企业网站中拥有极高的占有率。 Positive SSL证书包括DV SSL, EV SSL,也是唯一支持IP地址加密的…...
![](https://img-blog.csdnimg.cn/1ccc520fcf104736a5fe95a16ed374d0.png)
vulnhub靶场-y0usef笔记
vulnhub靶场-y0usef笔记 信息收集 首先fscan找到目标机器ip http://192.168.167.70/ nmap扫描端口 Host is up (0.00029s latency). Not shown: 998 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 (Ub…...
华为智选首款纯电轿跑“LUXEED”能大卖吗?
监制 | 何玺 排版 | 叶媛 华为智选纯电轿跑来袭! 8月7日,华为常务董事余承东在社交媒体上发文,宣布华为智选即将推出首款“突破想象”的纯电轿跑车。 01 华为智选首款纯电轿跑来袭 余承东的发文引起了极大关注,在各大媒体的报…...
![](https://img2018.cnblogs.com/blog/1156376/201809/1156376-20180928114643779-46150532.png)
django 做网站 原理/seo实战培训
系统安装时候使用的默认分区,根分区只分了50G,使用的是LVM 想把home分区分出来660G给根分区 先查了点资料开搞 由于xfs分区只支持增大,不支持缩小,所以home目前是xfs格式无法进行缩小操作,该怎么办? 想到了…...
![](https://img-blog.csdnimg.cn/img_convert/9c0a1dfc19121c5222dcfb5792d7422d.png)
腾博会的网站是什么/百度关键词seo推广
基础知识 jwt是由三部分构成的,第一部分是头部(header),第二部分是载荷(payload),第三部分为签证(signature) 头部 头部声明了类型和加密方法,如下 {typ:…...
![](/images/no-images.jpg)
如何把做的网站放到百度上/百度一下百度首页官网
创建一个数据库create database aaa[数据库名]; 删除一个数据库drop database aaa[数据库名]; create database bbbon primary--指定主数据文件( namebbb, size5mb, maxsize100bm, filenamec:\test.mdf )log on( namebbb_log, size5mb, maxsize100bm, filenamec:\tes…...
![](https://img-blog.csdnimg.cn/20201101204213119.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMTYyNQ==,size_16,color_FFFFFF,t_70)
北京网站建设公司网络营销外包网络建站报价/企业seo优化
java 动态规划(三角形最短路径和) ************************** 三角形最短路径和 问题描述 给定一个三角形,找出自顶向下的最小路径和 每一步只能移动到下一行中相邻的结点上(相邻节点:索引相同、索引1)示例: [[2],[…...
![](/images/no-images.jpg)
东莞网站建设技术支持/新品怎么刷关键词
因为Java识别编码为Unicode,而计算机系统编码常常是GBK,UTF8等编码,所以要转换为Unicode编码这时可以用Java\jdk1.x.x\bin\native2ascii.exe工具。 用JDK提供的native2ascii,进行编码转换用法:native2ascii [-reverse]…...
![](http://www.myloadtest.com/resources/google-trends-new-relic-vs-appdynamics.png)
成都网站建设scwbo/陕西网站设计
前: New Relic的上市使得IT和资本界开始重新重视APM,当然跟传统APM相比,New Relic还是有相当的创新,另外还有一点是目前的创业潮导致的企业级需求增大。 In recent years, IT projects seem to have stopped asking “which APM s…...