30.多个线程交替执行

线程一输出a,5次;

线程二输出b,5次;

线程三输出c,5次;

现在要求输出abcabcabcabcabc怎么实现?

采用wait和notifyAll实现

public class ThreadTest {public static void main(String[] args) {WaitNotify waitNotify = new WaitNotify(1, 5);new Thread(() -> waitNotify.print("a", 1, 2), "t1").start();new Thread(() -> waitNotify.print("b", 2, 3), "t2").start();new Thread(() -> waitNotify.print("c", 3, 1), "t3").start();}
}class WaitNotify {public void print(String str, int waitFlag, int nextFlag) {//t1线程启动,有五次循环,只有第一次满足条件输出a,flag=2,剩下的四次循环变成四个线程处于等待状态//t2线程启动,有五次循环,只有第一次满足条件输出b,flag=3,剩下的四次循环变成四个线程处于等待状态//t3线程启动,有五次循环,只有第一次满足条件输出c,flag=1,剩下的四次循环变成四个线程处于等待状态//t1线程上次处于等待的四个线程中的第一个线程满足条件输出a,flag=2,剩下三次循环变成三个线程处于等待状态//t2线程上次处于等待的四个线程中的第一个线程满足条件输出b,flag=3,剩下三次循环变成三个线程处于等待状态//t3线程上次处于等待的四个线程中的第一个线程满足条件输出c,flag=1,剩下三次循环变成三个线程处于等待状态//依此类推...for (int i = 0; i < loopNumber; i++) {synchronized (this) {while (flag != waitFlag) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.print(str);flag = nextFlag;this.notifyAll();}}}//等待标记private int flag;//循环次数private int loopNumber;public WaitNotify(int flag, int loopNumber) {this.flag = flag;this.loopNumber = loopNumber;}
}

采用await和signal方法实现 

public class ThreadTest2 {public static void main(String[] args) {AwaitSignal awaitSignal = new AwaitSignal(5);//存放t1线程中a字符串的条件集合Condition condition1 = awaitSignal.newCondition();//存放t2线程中a字符串的条件集合Condition condition2 = awaitSignal.newCondition();//存放t3线程中a字符串的条件集合Condition condition3 = awaitSignal.newCondition();new Thread(() -> awaitSignal.print("a", condition1, condition2), "t1").start();new Thread(() -> awaitSignal.print("b", condition2, condition3), "t2").start();new Thread(() -> awaitSignal.print("c", condition3, condition1), "t3").start();//休息1s,让上面三个线程各自进入各自的条件集合等待try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//主线程唤醒第一个条件集合awaitSignal.lock();try {condition1.signal();}finally {awaitSignal.unlock();}}
}class AwaitSignal extends ReentrantLock{//输出次数private int loop;public AwaitSignal(int loop) {this.loop = loop;}public void print(String str, Condition current, Condition next) {for (int i = 0; i < loop; i++) {this.lock();try {try {//进入当前条件集合等待current.await();System.out.print(str);} catch (InterruptedException e) {e.printStackTrace();}//唤醒下一个条件集合next.signal();}finally {this.unlock();}}}
}

采用park和unpark方法实现

public class ParkUnParkDemo {static Thread t1;static Thread t2;static Thread t3;public static void main(String[] args) {PrakUnpak prakUnpak = new PrakUnpak(5);t1 = new Thread(() -> {prakUnpak.print("a", t2);}, "t1");t2 = new Thread(() -> {prakUnpak.print("b", t3);}, "t2");t3 = new Thread(() -> {prakUnpak.print("c", t1);}, "t3");t1.start();t2.start();t3.start();//唤醒t1线程LockSupport.unpark(t1);}
}class PrakUnpak {private int loopCount;public PrakUnpak(int loopCount) {this.loopCount = loopCount;}public void print(String text, Thread next) {for (int i = 0; i < loopCount; i++) {LockSupport.park();System.out.print(text);LockSupport.unpark(next);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/792154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3DGS实时高质量大规模场景渲染最新SOTA!

作者&#xff1a;小柠檬 | 来源&#xff1a;3DCV 在公众号「3DCV」后台&#xff0c;回复「原论文」可获取论文pdf 添加微信&#xff1a;dddvision&#xff0c;备注&#xff1a;3D高斯&#xff0c;拉你入群。文末附行业细分群 详细内容请关注3DCV 3D视觉精品课程&#xff1a;…

【Java EE】Maven jar 包下载失败问题的解决方法

文章目录 1. 配置好国内的Maven源1.1配置当前项⽬setting1.2设置新项⽬的setting 2.重新下载jar包3.其他问题⭕总结 1. 配置好国内的Maven源 因为中央仓库在国外, 所以下载起来会⽐较慢, 所以咱们选择借助国内⼀些公开的远程仓库来下载资源 接下来介绍, 如何设置国内源 1.1配…

【JAVAEE学习】探究Java中多线程的使用和重点及考点

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

Arcgis研究区图经纬度(南北)切换为英文字体(SN)

只在做英文论文研究区图的时候用&#xff0c;平常为了方便还是切换为中文

面试题:JVM 调优

一、JVM 参数设置 1. tomcat 的设置 vm 参数 修改 TOMCAT_HOME/bin/catalina.sh 文件&#xff0c;如下图 JAVA_OPTS"-Xms512m -Xmx1024m" 2. springboot 项目 jar 文件启动 通常在linux系统下直接加参数启动springboot项目 nohup java -Xms512m -Xmx1024m -jar…

作业3:计算机体系结构属性优选

作业3&#xff1a;计算机体系结构属性优选 一. 单选题&#xff08;共11题&#xff0c;55分&#xff09; (单选题)下列哪个选项属于非线性结构&#xff08; &#xff09;&#xff1f; A. 线性表 B. 栈 C. 树 D. 队列 正确答案: C:树; (单选题) 浮点数在机器中的表示形式如下所…

JS详解-fetch核心语法

document.querySelector(.btn).addEventListener(click,async () > {const p new URLSearchParams({pname:浙江省,cname:杭州市})//1、如何请求&#xff1f;默认为get&#xff0c;参数1 url地址&#xff0c;返回promiseconst res await fetch(http://hmajax.itheima.net/…

给你一个网站如何测试?

主要围绕&#xff0c;功能&#xff0c;页面 UI &#xff0c;兼容&#xff0c;性能&#xff0c;安全&#xff0c;这几个方面去聊&#xff0c;首先是制定测试计划&#xff0c;确定测试范围和测试策略&#xff0c;一般包括以下几个部分&#xff1a;功能性测试&#xff1b;界面测试…

【打印SQL执行日志】⭐️Mybatis-Plus通过配置在控制台打印执行日志

目录 前言 一、Mybatis-Plus 开启日志的方式 二、测试 三、日志分析 章末 前言 小伙伴们大家好&#xff0c;相信大家平时在处理问题时都有各自的方式&#xff0c;最常用以及最好用的感觉还是断点调试&#xff0c;但是涉及到操作数据库的执行时&#xff0c;默认的话在控制台…

Comfyui插件CLIPSeg应该如何安装

✨背景 GitHub - biegert/ComfyUI-CLIPSeg: ComfyUI CLIPSeg Comfyui-CLIPSeg是一个相对没那么大众的插件&#xff0c;在基于语义分割和自动抠图方面&#xff0c;还是比较实用的一个插件。但是插件安装起来&#xff0c;跟普通的插件安装有亿点不一样&#xff0c;所以很多小朋友…

excel中文本列显示e+17这样的科学计数法如何处理

我的excel中文本列显示e17这样的科学计数法 然后右键&#xff0c;设置单元格格式&#xff0c;为特殊&#xff0c;邮政编码&#xff0c;点确定即可 最后效果如下

全网最强JavaWeb笔记 | 万字长文爆肝JavaWeb开发——day05_SpringBootWeb请求响应

万字长文爆肝黑马程序员2023最新版JavaWeb教程。这套教程打破常规&#xff0c;不再局限于过时的老套JavaWeb技术&#xff0c;而是与时俱进&#xff0c;运用的都是企业中流行的前沿技术。笔者认真跟着这个教程&#xff0c;再一次认真学习一遍JavaWeb教程&#xff0c;温故而知新&…

如何通过ArkTS卡片的Canvas自定义绘制能力实现五子棋游戏卡片

介绍 本示例展示了如何通过ArkTS卡片的Canvas自定义绘制能力实现一个简单的五子棋游戏卡片。 使用Canvas绘制棋盘和黑白棋子的落子。通过卡片支持的点击事件进行交互&#xff0c;让用户在棋盘上进行黑白棋子的对局。通过TS的逻辑代码实现五子棋输赢判定、回退等逻辑计算&…

算法沉淀 —— 动态规划(子序列问题(上))

算法沉淀 —— 动态规划&#xff08;子序列问题&#xff08;上&#xff09;&#xff09; 前言一、最长递增子序列二、摆动序列三、 最长递增子序列的个数四、最长数对链 前言 几乎所有的动态规划问题大致可分为以下5个步骤&#xff0c;后续所有问题分析都将基于此 1.、状态表示…

BigInteger 大整数 比较大小

一、以整数型礼品交易为例子 int userSend Integer.valueOf(id);int amount Integer.valueOf(amountStr);int userAccept Integer.valueOf(userIdAccept);GiftService giftService new GiftService();boolean carry1 giftService.isHavePropertyByUserIdByGiftId(userSend…

Minikube本地搭建单节点Kubernetes集群

1、什么是 Minikube Minikube 是一个开源工具&#xff0c;旨在为开发者提供一种便捷的方式在本地环境中搭建单节点的 Kubernetes 集群。它主要用于开发、测试和学习 Kubernetes 应用程序&#xff0c;无需依赖大型的硬件资源或复杂的多节点集群配置。minikube 使用轻量级虚拟化技…

C/C++程序的(编译,链接)翻译与运行

目录 前言&#xff1a; 1.程序环境 2.翻译环境 3.预处理&#xff08;预编译&#xff09; 4.编译 5.汇编 6.链接 7.运行环境 总结&#xff1a; 前言&#xff1a; 本篇来解释c/c程序的翻译环境与运行环境中的过程&#xff0c;不同的编程语言的翻译环境类似&#xff0c;…

Transformers in Vision:A Survey 阅读笔记

ACM上的一篇综述&#xff0c;讨论Transformer在CV上的应用。 摘要&#xff1a; Among their salient benefits,Transformers enable modeling long dependencies between inputsequence elements and support parallel processing of sequence as compared to recurrent networ…

信息传播的AI时代:机器学习赋能新闻出版业的数字化之旅

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

leetcode90. 子集 II

去重逻辑&#xff1a; 关键是画出递归树&#xff01;当我们即将进入第二个2的递归的时候&#xff0c;发现isVisit数组是100&#xff0c;也就是说这俩重复的数是False&#xff0c;并且这俩在nums值相同&#xff0c;所以写出去重逻辑&#xff01; class Solution { public:vector…