三个线程轮流执行按顺序打印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

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

Java中如何正确的停掉线程

《Java中如何正确的停掉线程》Java通过interrupt()通知线程停止而非强制,确保线程自主处理中断,避免数据损坏,线程池的shutdown()等待任务完成,shutdownNow()强制中断... 目录为什么不强制停止为什么 Java 不提供强制停止线程的能力呢?如何用interrupt停止线程s

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

SpringBoot实现虚拟线程的方案

《SpringBoot实现虚拟线程的方案》Java19引入虚拟线程,本文就来介绍一下SpringBoot实现虚拟线程的方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录什么是虚拟线程虚拟线程和普通线程的区别SpringBoot使用虚拟线程配置@Async性能对比H

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(