多线程之交替输出abc

2024-05-13 02:20
文章标签 输出 多线程 abc 交替

本文主要是介绍多线程之交替输出abc,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、wait notify 版

public class SyncWaitNotify {//打印标识:1打印a,2打印b,3打印cprivate int flag;//每个字母的打印次数private int loopNumber;//构造方法public SyncWaitNotify(int flag, int loopNumber) {this.flag = flag;this.loopNumber = loopNumber;}public static void main(String[] args) {SyncWaitNotify syncWaitNotify = new SyncWaitNotify(1, 5);//打印a的线程new Thread(() -> {//打印asyncWaitNotify.print(1, 2, "a");}).start();//打印b的线程new Thread(() -> {//打印bsyncWaitNotify.print(2, 3, "b");}).start();//打印c的线程new Thread(() -> {//打印csyncWaitNotify.print(3, 1, "c");}).start();}//根据参数打印不同的字母/** waitFlag:根据这个参数打印对应的字母* nextFlag:下一个要打印的字母对应的flag值* str:要打印的字母* */public void print(int waitFlag, int nextFlag, String str) {for (int i = 0; i < loopNumber; i++) {//加锁synchronized (this) {//判断当前flag值是否和要打印的字母对应的flag值相等while (this.flag != waitFlag) {//不想等则让出cpu,等待其他线程执行try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}//相等则打印System.out.print(str);//修改flag的值flag = nextFlag;//唤醒所有等待的线程this.notifyAll();}}}
}

2、Lock 条件变量版

public class AwaitSignal extends ReentrantLock {// 循环次数private int loopNumber;public AwaitSignal(int loopNumber) {this.loopNumber = loopNumber;}public void start(Condition first) {this.lock();try {//唤醒打印a的线程first.signal();}finally {this.unlock();}}public void print(String str, Condition current, Condition next) {for (int i = 0; i < loopNumber; i++) {//获得锁this.lock();try {//进入等待current.await();//打印字母System.out.println(str);//唤醒下一个要打印的线程next.signal();}catch (InterruptedException e) {e.printStackTrace();}finally {//释放锁this.unlock();}}}public static void main(String[] args) {AwaitSignal as = new AwaitSignal(5);//a的条件变量Condition aWaitSet = as.newCondition();//b的条件变量Condition bWaitSet = as.newCondition();//c的条件变量Condition cWaitSet = as.newCondition();//打印a的线程new Thread(() -> {as.print("a", aWaitSet, bWaitSet);}).start();//打印b的线程new Thread(() -> {as.print("b", bWaitSet, cWaitSet);}).start();//打印c的线程new Thread(() -> {as.print("c", cWaitSet, aWaitSet);}).start();//先让a线程获取锁,并唤醒a线程,否则所有线程都会进入等待as.start(aWaitSet);}
}

这篇关于多线程之交替输出abc的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

python多线程并发测试过程

《python多线程并发测试过程》:本文主要介绍python多线程并发测试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、并发与并行?二、同步与异步的概念?三、线程与进程的区别?需求1:多线程执行不同任务需求2:多线程执行相同任务总结一、并发与并行?1、

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring