Java三个线程轮流打印20次

如何实现Java多线程交替打印20次数据?

使用synchronized+共享信号量

解题思路,synchronized拿到锁,检查线程是否要执行业务代码,如果是,打印,并更改共享信号量,如果不是,wait交出锁。

注意:在执行完业务代码后需要唤醒线程,由于我们是根据共享变量来决定执行线程的,所以需要唤醒全部的线程,这里使用notifyAll,而非notify,有很多新手在写代码时会遇到多线程卡死的问题,具体表现是没有线程执行代码,但是程序不结束,这就有可能是没有唤醒所有线程,使得线程全部在阻塞队列。

public class Solution{public static volatile int idx;public static Object obj;public static void main(String[] args) {idx = 0;obj = new Object();Runnable runnable = new Runnable() {@Overridepublic void run() {while (idx < 20) {synchronized (obj) {String s = Thread.currentThread().getName();if ((s.equals("A") && idx % 3 == 0) || (s.equals("B") && idx % 3 == 1) || (s.equals("C") && idx % 3 == 2)) {System.out.println(s + idx);idx++;// 这里使用notify可能会唤醒错误的线程,所以最好全部唤醒,去争夺锁obj.notifyAll();} else {try {obj.wait();} catch (Exception e) {e.printStackTrace();}}}}}};new Thread(runnable, "A").start();new Thread(runnable, "B").start();new Thread(runnable, "C").start();}
}

使用ReentrantLock+Condition

使用流程:加锁,判断当前条件是否要await,如果不是,就执行业务代码,并让约定顺序的下一个Condition执行。

唯一缺点是判断是否要await时不够优雅,这一点还要再看看。

public class ByteDance0705 {private static volatile int idx = 0;private static ReentrantLock lock = new ReentrantLock();private static Condition conditionA = lock.newCondition();private static Condition conditionB = lock.newCondition();private static Condition conditionC = lock.newCondition();public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {for (int i=0;i<20;i+=3) {print("A", conditionA, conditionB);}}}).start();new Thread(new Runnable() {@Overridepublic void run() {for (int i=1;i<20;i+=3) {print("B", conditionB, conditionC);}}}).start();new Thread(new Runnable() {@Overridepublic void run() {for (int i=2;i<20;i+=3) {print("C", conditionC, conditionA);}}}).start();}public static void print(String s, Condition cur, Condition next) {try {lock.lock();if (idx < 20) {while ((s.equals("A") && idx % 3 != 0) || (s.equals("B") && idx % 3 != 1) || (s.equals("C") && idx % 3 != 2)) cur.await();System.out.println(s + idx);idx++;next.signal();}} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
}

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

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

相关文章

AndroidKille不能用?更新apktool插件-cnblog

AndroidKiller不更新插件容易报错 找到apktool管理器 填入apktool位置&#xff0c;并输入apktool名字 选择默认的apktool版本 x掉&#xff0c;退出重启 可以看到反编译完成了

巨人的数量

题目 巨人是像泰坦那么大的人形生物&#xff0c;并且对人类虎视眈眈。人类筑起三堵圆形高墙&#xff0c;里外三层用来抵御巨人的侵袭。调查兵团是一只大约十五人的队伍&#xff0c;负责高墙外围的警戒&#xff0c;一旦发现来犯的巨人&#xff0c;必须立刻向上级汇报。上级会对…

Shell echo命令

Shell echo命令 在Shell编程中,echo命令是一个常用的内置命令,用于在终端或控制台上显示文本或变量的值。它是与用户交互的一种基本方式,经常用于输出信息、创建文件内容或与脚本的其他部分进行通信。本文将详细介绍echo命令的用法、选项和实际应用示例。 基本用法 echo命…

JavaDS预备知识

集合框架 Java 集合框架 Java Collection Framework &#xff0c;又被称为容器 container &#xff0c;是定义在 java.util 包下的一组接口 interfaces和其实现类 classes 。 其主要表现为将多个元素 element 置于一个单元中&#xff0c;对数据进行创建(Create)、读取(Retrieve…

振动分析-12-轴承数据库之深度学习一维故障分类CNN-Transformer

Python轴承故障诊断 (15)基于CNN-Transformer的一维故障信号识别模型 1 制作数据集 import pandas as pd filename = "CWRU_1797.csv" df = pd.read_csv(filename)from sklearn.model_selection import train_test_split df_x=df.drop(labels=1024,axis=1)

【论文阅读】-- Interactive Horizon Graphs:改进多个时间序列的紧凑可视化

Interactive Horizon Graphs: Improving the Compact Visualization of Multiple Time Series 摘要1 引言2 相关工作2.1 多个时间序列的可视化2.2 缩减折线图 &#xff08;RLC&#xff09;2.3 地平线图 &#xff08;HG&#xff09;2.4 大尺度和小尺度变异数据集2.5 多个时间序列…

掌握Postman拦截器:揭秘API调试的高级技巧

标题&#xff1a;掌握Postman拦截器&#xff1a;揭秘API调试的高级技巧 Postman是一款流行的API开发工具&#xff0c;它提供了丰富的特性来简化API的创建、测试和调试过程。拦截器&#xff08;Interceptor&#xff09;是Postman中一个强大的功能&#xff0c;允许用户捕获和修改…

HEX文件格式

HEX文件格式是一种用于存储和传输数据到嵌入式系统&#xff08;如单片机&#xff09;的文件格式。以下是关于HEX文件格式的详细解释&#xff1a; 一、文件概述 HEX文件&#xff0c;全称为Intel HEX&#xff0c;是一种ASCII文本文件&#xff0c;用于记录文本行的数据。它常用于…

c#实现23种常见的设计模式--动态更新

c#实现23种常见的设计模式 设计模式通常分为三个主要类别&#xff1a; 创建型模式 结构型模式 行为型模式。 这些模式是用于解决常见的对象导向设计问题的最佳实践。 以下是23种常见的设计模式并且提供c#代码案例&#xff1a; 创建型模式&#xff1a; 1. 单例模式&#…

EasyOCR: 简单易用的多语言OCR工具

EasyOCR: 简单易用的多语言OCR工具 1. 什么是EasyOCR?2. 使用场景3. 基本使用方法安装示例代码代码解释 4. 结语 1. 什么是EasyOCR? EasyOCR是一个基于Python的开源光学字符识别(OCR)工具,它支持80多种语言的文本识别。该项目由JaidedAI开发,旨在提供一个简单易用但功能强大…

【Docker系列】Docker 镜像构建中的跨设备移动问题及解决方案

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【C++】 解决 C++ 语言报错:Invalid Use of ‘void’ Expression

文章目录 引言 在 C 编程中&#xff0c;错误使用 void 表达式&#xff08;Invalid Use of ‘void’ Expression&#xff09;是常见的编译错误之一。void 类型表示没有返回值&#xff0c;当程序试图将 void 类型的表达式用作有值表达式时&#xff0c;会引发此错误。本文将深入探…

浅谈Spring中的一些技术

一、前言 在学习Spring或者SpringBoot原理时&#xff0c;心里要始终想着一件事情&#xff1a;只有把对象&#xff08;也可以称之为组件、bean&#xff09;放入到Spring的IOC容器中&#xff0c;才能使用Spring为我们提供的一系列强大功能。 二、一些说明 在学习Spring或者Sprin…

django学习入门系列之第四点《案例 登录》

文章目录 前期准备&#xff1a;步骤整体代码往期回顾 前期准备&#xff1a; 宽度 居中内边距表单 步骤 先准备一个框&#xff0c;作为登录界面的容器 .frame{height: 380px;width: 600px;margin: 150px auto 0;border: 1px solid black;}将里面输入登录样式内容&#xff08;…

Towards Deep Learning Models Resistant to Adversarial Attacks

这篇论文的主要内容是关于开发对抗攻击具有抗性的深度学习模型。对抗攻击是通过对输入数据进行微小且精心设计的扰动&#xff0c;诱使深度学习模型做出错误的预测。这种攻击在图像识别、语音识别和自然语言处理等任务中尤为突出。 这篇论文的主要内容是关于开发对抗攻击具有抗…

Redis---8---哨兵(sentinel)

Redis—8—哨兵&#xff08;sentinel&#xff09; 是什么 吹哨人巡查监控后台master主机是否故障&#xff0c;如果故障了根据*** 投票数 *** 自动将某一个从库转换为新主库&#xff0c;继续对外服务。 作用&#xff1a; 俗称&#xff0c;无人值守运维 ​ 1&#xff0c;监控…

基于深度学习的异常行为检测

基于深度学习的异常行为检测是一种通过分析视频或传感器数据自动检测异常行为的技术&#xff0c;广泛应用于公共安全、工业监控、金融欺诈检测等领域。异常行为检测旨在识别与正常行为模式不同的异常活动&#xff0c;从而及时预警和采取措施。以下是关于这一领域的系统介绍&…

layui-表单(输入框)

1.基本使用方法 先写一个表单元素块 form 加上layui-form 里面写行区块结构&#xff0c;如下&#xff1a; 2.输入框选项 placeholder默认文本 autocomplete自动填充 lay-verify required必填

社交媒体原生应用开发:Facebook的创新之路

摘要 在数字化时代&#xff0c;社交媒体的原生应用开发已成为连接用户与平台的桥梁。Facebook作为全球领先的社交媒体平台&#xff0c;其原生应用的开发经验为行业提供了宝贵的参考。 关键词 社交媒体&#xff0c;原生应用开发&#xff0c;Facebook&#xff0c;用户体验&…

报错:CodeArts部署Java/SpringBoot/SpringCloud项目报错:Deploy task execution failed.

背景&#xff1a; 目前想要部署SpringCloud服务&#xff0c;使用页面传参的方式。但是传参后&#xff0c;部署报错。错误如下&#xff1a; [2024/06/28 18:09:29.114 GMT08:00] ok: [1_***.***.***.226] > { [2024/06/28 18:09:29.114 GMT08:00] "msg": &quo…