三个线程轮流执行按顺序打印123

2024-01-18 10:12

本文主要是介绍三个线程轮流执行按顺序打印123,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

三个线程无限循环轮流执行按顺序打印123

实现思路:
三个线程基于不同的Condition完成等待和继续

最简单的实现(不考虑任何封装):

public class Solution {public static void main(String[] args) throws InterruptedException {ReentrantLock lock = new ReentrantLock();Condition condition1 = lock.newCondition();Condition condition2 = lock.newCondition();Condition condition3 = lock.newCondition();new Thread(new Runnable() {@Overridepublic void run() {while (true) {System.out.println("1");try {lock.lock();condition2.signal();condition1.await();} catch (InterruptedException e) {throw new RuntimeException(e);} finally {lock.unlock();}}}}).start();//线程start之后不一定立即run起来-这里测试用的代码-用来先后启动目标线程Thread.sleep(100);new Thread(new Runnable() {@Overridepublic void run() {while (true) {System.out.println("2");try {lock.lock();condition3.signal();condition2.await();} catch (InterruptedException e) {throw new RuntimeException(e);} finally {lock.unlock();}}}}).start();//线程start之后不一定立即run起来-这里测试用的代码-用来先后启动目标线程Thread.sleep(100);new Thread(new Runnable() {@Overridepublic void run() {while (true) {System.out.println("3");try {lock.lock();condition1.signal();condition3.await();} catch (InterruptedException e) {throw new RuntimeException(e);} finally {lock.unlock();}}}}).start();}}

简单封装一下

public class Solution {private static class PrintRunnable implements Runnable {private final String value;private final Lock lock;private final Condition cur, next;public PrintRunnable(String value, Lock lock, Condition cur, Condition next) {this.value = value;this.lock = lock;this.cur = cur;this.next = next;}@Overridepublic void run() {while (true) {System.out.println(value);try {lock.lock();//这里next.signal();//这里特别注意:await会阻塞线程-因此要在这之前触发signalcur.await();} catch (InterruptedException e) {throw new RuntimeException(e);} finally {lock.unlock();}}}}public static void main(String[] args) throws InterruptedException {ReentrantLock lock = new ReentrantLock();Condition condition1 = lock.newCondition();Condition condition2 = lock.newCondition();Condition condition3 = lock.newCondition();new Thread(new PrintRunnable("1", lock, condition1, condition2)).start();Thread.sleep(100);new Thread(new PrintRunnable("2", lock, condition2, condition3)).start();Thread.sleep(100);new Thread(new PrintRunnable("3", lock, condition3, condition1)).start();}}

这篇关于三个线程轮流执行按顺序打印123的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/618726

相关文章

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

无线路由器哪个品牌好用信号强? 口碑最好的三个路由器大比拼

《无线路由器哪个品牌好用信号强?口碑最好的三个路由器大比拼》不同品牌在信号覆盖、稳定性和易用性等方面各有特色,如何在众多选择中找到最适合自己的那款无线路由器呢?今天推荐三款路由器让你的网速起飞... 今天我们来聊聊那些让网速飞起来的路由器。在这个信息爆炸的时代,一个好路由器简直就是家庭网编程络的心脏。无论你

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

PHP执行php.exe -v命令报错的解决方案

《PHP执行php.exe-v命令报错的解决方案》:本文主要介绍PHP执行php.exe-v命令报错的解决方案,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录执行phpandroid.exe -v命令报错解决方案执行php.exe -v命令报错-PHP War

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S