多线程之交替输出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);}
}

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

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

相关文章

无人机姿态模式(Attitude Mode)和导航模式(Navigation Mode)以及自动模式的区别

姿态模式&#xff08;Attitude Mode&#xff09;和导航模式&#xff08;Navigation Mode&#xff09;是无人机飞行控制系统中两种基本的飞行模式&#xff0c;它们在飞行控制和操作上有着显著的区别&#xff1a; 姿态模式&#xff1a; 在姿态模式下&#xff0c;飞控主要关注维…

重发布和路由策略实验(课堂练习)

需求&#xff1a; 将1.1.1.0/24网段&#xff08;不在OSPF中&#xff09;重发布到网络中&#xff0c;不允许出现次优路径&#xff0c;实现全网可达。 需求分析&#xff1a; 1、在R1上重发布1.1.1.0/24网段&#xff0c;但是需要过滤192.168.12.0/24和192.168.13.0/24 2、在R2和R3…

网络编程学习笔记1

文章目录 一、socket1、创建socket2、网络通信流程3、accept()函数4、signal()函数5、recv()函数6、connect()函数 二、I/O多路复用1.select模型2.poll模型3.epoll模型 注 一、socket 1、创建socket int socket(int domain,int type,int protocol); //返回值&#xff1a;一个…

linq常用方法

1.Where - 用于筛选满足特定条件的元素。 var query list.Where(x > x > 10); 2.Select - 用于投影每个元素到一个新的形式。这通常用于转换数据的形状。 var query list.Select(x > x * x); 3.OrderBy / OrderByDescending - 用于对元素进行升序或降序排序。 var…

1.5. 离散时间鞅-平方可积鞅

平方可积鞅 平方可积鞅1. BDG极大值不等式1.1. 有限时间BDG不等式1.2. 无限时间的BDG不等式2. 平方可积鞅的收敛性2.1. { A ∞ < ∞ } \left\{A_{\infty}<\infty\right\}

Servlet讲解

Servlet生命周期 我们只需要继承Servlet接口&#xff0c;查看方法即可看出Servlet的生命周期 import java.io.IOException;import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest…

对数据进行标准化和归一化

数据的形式&#xff1a;保存在CSV中&#xff0c;第一列为姓名&#xff0c;第二列之后为特征。 标准化 输入文件的路径&#xff0c;设置保存转化后的文件路径 import pandas as pd from sklearn.preprocessing import StandardScaler# 读取CSV文件 data pd.read_csv(rC:\User…

信息系统项目管理师(高项)--学习笔记【第7章:立项管理】完善中~~~

目录 第7章 立项管理7.1 项目建议与立项申请7.2 项目可行性研究7.2.1可行性研究的内容7.2.2初步可行性研究7.2.3详细可行性研究 7.3 项目评估与决策 第7章 立项管理 7.1 项目建议与立项申请 7.2 项目可行性研究 7.2.1可行性研究的内容 7.2.2初步可行性研究 7.2.3详细可行性…

AMD CPU Nvidia GPU Ubuntu 黑屏网络故障案例分享

&#xff08;首发地址&#xff1a;学习日记 https://www.learndiary.com/2024/05/grub-xorg/&#xff09; 朋友们&#xff0c;大家好&#xff01;我是来自淘宝网学习日记小店的 Linux 服务者 learndiary。今天&#xff0c;我将和大家分享一个关于AMD Ryzen 9 7950X3D 16核 CPU …

GPT 大型语言模型可视化教程

网址&#xff1a; LLM Visualization 简介 欢迎来到 GPT 大型语言模型演练&#xff01;在这里&#xff0c;我们将探索只有 85,000 个参数的 nano-gpt 模型。 它的目标很简单&#xff1a;取一个由六个字母组成的序列&#xff1a; C B A B B C 并按字母顺序排列&#xff0c;即…

Jboss 反序列化 CVE-2017-12149

一、漏洞简介 JBoss是一个管理EJB的容器和服务器&#xff0c;支持EJB 1.1、EJB 2.0和EJB3的规范。在/invoker/readonly路径下&#xff0c;攻击者可以构造序列化代码传入服务器进行反序列化,由于没有对反序列化操作进行任何检测&#xff0c;导致攻击者可以执行任意代码。 而jbo…

TCP(TCP客户端、服务器如何通信)

一、TCP介绍 TCP的特点&#xff1a; 面向连接的协议&#xff1a;TCP是一种可靠的、面向连接的协议&#xff0c;在通信之前需要建立连接&#xff0c;以确保数据的可靠传输。这意味着在传输数据之前&#xff0c;发送方和接收方之间需要建立一条可靠的连接通道。流式协议&#x…

Linux实验 系统管理(三)

实验目的&#xff1a; 了解Linux系统下的进程&#xff1b;掌握一类守护进程——计划任务的管理&#xff1b;掌握进程管理的常用命令&#xff1b;掌握进程的前台与后台管理&#xff1b;了解Linux系统的运行级别&#xff1b;掌握系统服务管理的常用命令。 实验内容&#xff1a; …

在线教育系统先进单位事迹,教育行业公众号线上推广如何有效果?

教育行业的市场前景十分大&#xff0c;相对的来说行业之间的竞争也是十分激烈的&#xff0c;培训机构想要在激烈竞争中脱颖而出就需要进行推广&#xff0c;很多机构都是有自己的公众号&#xff0c;那教育行业公众号线上推广如何有效果&#xff1f; 微信公众号可以做做教程&…

040——移植数据库sqlite3到i.mx6ull

目录 一、下载 二、移植数据库 三、测试sqlite3 一、下载 SQLite Download Page 暂时先下载最新版的试试&#xff0c;我们以前其实在ubuntu上直接使用过 嵌入式数据库sqlite3_常见的嵌入式数据库-CSDN博客 当时我把常用的操作和怎么使用记录下来了 现在把他移植到开发板…

GitFlow流程

分支角色 主分支&#xff08;master/main&#xff09;: 代表最新的正式发布版本&#xff0c;应始终保持稳定&#xff0c;可以直接用于生产环境。只有在完成一个新版本的开发并经过测试后&#xff0c;才将发布分支合并到主分支。 开发分支&#xff08;develop&#xff09;: 包含…

下水道井盖多分类检测定位

下水道井盖识别&#xff0c;多分类&#xff0c;使用yolov5训练&#xff0c;采用一部分开源数据集和自建数据集。python pytorch opencv 深度学习#人工智能#深度学习#目标检测

Python 的 QT 界面中记住上次的设置

要在 Python 的 QT 界面中记住上次的设置&#xff0c;可以使用一些持久化存储的方法&#xff0c;比如将设置信息保存到文件中或使用数据库。 以下是一个简单的示例&#xff0c;展示了如何将设置信息保存到文件中&#xff1a; import jsondef save_settings(settings):with op…

【Python项目】基于大数据的【电影市场预测分析】

技术简介&#xff1a;使用Python技术、B/S架构、MYSQL数据库等实现。 系统简介&#xff1a;系统都需要简单的安全登陆检查&#xff0c;在登陆成功之后要进行在映电影的分析、票房分析、电影数据等功能相关性的数据统计&#xff0c;为了使用方便这些统计型的数据使用图表来进行表…