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

相关文章

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表