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

相关文章

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

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