多线程 Leetcode 打印零与奇偶数
现有函数 printNumber 可以用一个整数参数调用,并输出该整数到控制台。
- 例如,调用
printNumber(7)将会输出7到控制台。
给你类 ZeroEvenOdd 的一个实例,该类中有三个函数:zero、even 和 odd 。ZeroEvenOdd 的相同实例将会传递给三个不同线程:
- 线程 A:调用
zero(),只输出0 - 线程 B:调用
even(),只输出偶数 - 线程 C:调用
odd(),只输出奇数
修改给出的类,以输出序列 "010203040506..." ,其中序列的长度必须为 2n 。
实现 ZeroEvenOdd 类:
ZeroEvenOdd(int n)用数字n初始化对象,表示需要输出的数。void zero(printNumber)调用printNumber以输出一个 0 。void even(printNumber)调用printNumber以输出偶数。void odd(printNumber)调用printNumber以输出奇数。
示例 1:
输入:n = 2 输出:"0102" 解释:三条线程异步执行,其中一个调用 zero(),另一个线程调用 even(),最后一个线程调用odd()。正确的输出为 "0102"。
示例 2:
输入:n = 5 输出:"0102030405"
1. Semaphore
class ZeroEvenOdd {private int n;private Semaphore zeroSema = new Semaphore(1);private Semaphore oddSema = new Semaphore(0);//奇数private Semaphore evenSema = new Semaphore(0);//偶数public ZeroEvenOdd(int n) {this.n = n;}public void zero(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {zeroSema.acquire();printNumber.accept(0);if (i % 2!= 0) {//奇数oddSema.release();} else {evenSema.release();}}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2== 0) {//偶数 打印偶数 并释放zero的线程evenSema.acquire();printNumber.accept(i);zeroSema.release();}}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2 != 0) {//奇数,打印奇数,并释放zero的线程oddSema.acquire();printNumber.accept(i);zeroSema.release();}}}
}
2. synchronized
class ZeroEvenOdd {private int n;private final Object ob=new Object();private volatile int flag=0;public ZeroEvenOdd(int n) {this.n = n;}public void zero(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {synchronized (ob){while (flag!=0){ob.wait();}printNumber.accept(0);if(i%2==0)flag=2;elseflag=1;ob.notifyAll();}}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2== 0) {//偶数 打印偶数 并释放zero的线程synchronized (ob){while (flag!=2){ob.wait();}printNumber.accept(i);flag=0;ob.notifyAll();}}}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2!= 0) {//偶数 打印偶数 并释放zero的线程synchronized (ob){while (flag!=1){ob.wait();}printNumber.accept(i);flag=0;ob.notifyAll();}}}}
}
3. CountDownLatch
class ZeroEvenOdd {private int n;private CountDownLatch countDownLatch_zero=new CountDownLatch(0);private CountDownLatch countDownLatch_even=new CountDownLatch(1);private CountDownLatch countDownLatch_odd=new CountDownLatch(1);public ZeroEvenOdd(int n) {this.n = n;}public void zero(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {countDownLatch_zero.await();printNumber.accept(0);countDownLatch_zero=new CountDownLatch(1);if (i % 2!= 0) {//奇数countDownLatch_odd.countDown();} else {countDownLatch_even.countDown();}}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2== 0) {//偶数 打印偶数 并释放zero的线程countDownLatch_even.await();printNumber.accept(i);countDownLatch_even=new CountDownLatch(1);countDownLatch_zero.countDown();}}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2 != 0) {//奇数,打印奇数,并释放zero的线程countDownLatch_odd.await();printNumber.accept(i);countDownLatch_odd=new CountDownLatch(1);countDownLatch_zero.countDown();}}}
}
4. Lock
class ZeroEvenOdd {private int n;private volatile int flag=0;Lock lock=new ReentrantLock();Condition condition_zero = lock.newCondition();Condition conditon_even = lock.newCondition();Condition condition_odd = lock.newCondition();public ZeroEvenOdd(int n) {this.n = n;}public void zero(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {lock.lock();try{while (flag!=0){condition_zero.await();}printNumber.accept(0);if(i%2==0) {flag = 2;conditon_even.signal();}else {flag = 1;condition_odd.signal();}}finally {lock.unlock();}}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2== 0) {//偶数 打印偶数 并释放zero的线程lock.lock();try {while (flag != 2) {conditon_even.await();}printNumber.accept(i);flag = 0;condition_zero.signal();}finally {lock.unlock();}}}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2!= 0) {//偶数 打印偶数 并释放zero的线程lock.lock();try {while (flag != 1) {condition_odd.await();}printNumber.accept(i);flag = 0;condition_zero.signal();}finally {lock.unlock();}}}}
}
相关文章:
多线程 Leetcode 打印零与奇偶数
现有函数 printNumber 可以用一个整数参数调用,并输出该整数到控制台。 例如,调用 printNumber(7) 将会输出 7 到控制台。 给你类 ZeroEvenOdd 的一个实例,该类中有三个函数:zero、even 和 odd 。ZeroEvenOdd 的相同实例将会传递…...
杭电oj--数列有序
有n(n<100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。 输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已…...
PHPEXCEL解决行数超过65536不显示问题
起因自然是导出数据到excel文件时,数据缺少现象。 百度讲解是将xls文件另存为xlsx文件。 除了这里的原因,还有一点是phpExcel存在两个写入类PHPExcel_Writer_Excel2007和PHPExcel_Writer_Excel5,而只有PHPExcel_Writer_Excel2007支持超过65…...
新媒体时代如何做好新型的网络口碑营销?
从人类开始交换商品的时代开始,口碑营销就已经存在,是靠口耳传播的营销方式。小马识途认为进入当今移动互联网时代,口碑营销又有了新的发展,网络口碑营销推广开始普及。营销人员将传统口碑营销与移动互联网营销相结合,…...
MySQL中InnoDB插入缓冲区(Insert Buffer)
一、插入缓冲区的基本原理 插入缓冲区(Insert Buffer,也称作 Change Buffer),是InnoDB存储引擎的一种内部机制,它允许系统将对非聚集索引页的写操作(例如插入、删除和更新)暂时缓存在内存中&am…...
VUE前端判断是电脑端还是移动端
背景需求 ruoyi框架,前后端分离。现在要在用户访问的时候根据不同的设备跳转到不同的登录页面。 教程 router/index.js 修改src/router/index.js,在这里增加自己的要跳转的页面 permission.js 在白名单中添加自己的登录页面 增加以下识别的代码 le…...
OpenGL —— 2.8、漫游之摄像机飞行移动(附源码,glfw+glad)
源码效果 C源码 纹理图片 需下载stb_image.h这个解码图片的库,该库只有一个头文件。 具体代码: vertexShader.glsl #version 330 corelayout(location 0) in vec3 aPos; layout(location 1) in vec2 aUV;out vec2 outUV;uniform mat4 _modelMatrix; …...
AM@麦克劳林公式逼近以及误差分析
abstract 麦克劳林公式及其近似表示的应用误差估计和分析 Lagrange型泰勒公式的估计误差 由Lagrange型余项泰勒公式可知,多项式 p n ( x ) p_n(x) pn(x)近似表达函数 f ( x ) f(x) f(x)时,其误差为 ∣ R n ( x ) ∣ |R_{n}(x)| ∣Rn(x)∣ R n ( x ) R_{n}(x) Rn(x) f …...
gitlab 离线安装问题解决:NOKEY,signature check fail
1,rpm安装gitlab问题 test1:/opt # rpm -ivh gitlab-ce-16.0.3-ce.0.el7.x86_64.rpm --force warning: gitlab-ce-16.0.3-ce.0.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID f27eab47: NOKEY error: [upel]: gitlab-ce NOKEY error: [upel]: gitlab-ce …...
uniapp使用uQRCode绘制二维码,下载到本地,调起微信扫一扫二维码核销
1.效果 2.在utils文件夹下创建uqrcode.js // uqrcode.js //--------------------------------------------------------------------- // github https://github.com/Sansnn/uQRCode //---------------------------------------------------------------------let uQRCode {…...
手写一个PrattParser基本运算解析器3: 基于Swift的PrattParser的项目概述
点击查看 基于Swift的PrattParser项目 PrattParser项目概述 前段时间一直想着手恶补 编译原理 的相关知识, 一开始打算直接读大学的 编译原理, 虽然内容丰富, 但是着实抽象难懂. 无意间看到B站的熊爷关于普拉特解析器相关内容, 感觉是一个非常好的切入点.所以就写了基于Swift版…...
三江学院“火焰杯”软件测试高校就业选拔赛颁奖仪式
11月25日下午,“火焰杯”软件测试开发选拔赛及三江-慧科卓越工程师班暑期编程能力训练营颁奖仪式在s楼会议室隆重举行。计算机科学与工程学院院长刘亚军、副院长叶传标、曹阳、吴德、院党总支副书记王兰英、系主任杨少雄、慧科企业代表尹沁伊人、项目负责人王旭出席…...
面试题-消息中间件篇-主流的消息中间件
消息中间件篇 第一章 主流的消息中间件对比 1、主流的消息中间件有 Kafka、RabbitMQ、ActiveMQ 等。 Kafka: Kafka 是一种高吞吐量、分布式、可扩展的发布/订阅消息系统,主要用于大数据处理和分析。Kafka 采用消息日志的方式来存储消息,可以…...
PyQt学习笔记-获取Hash值的小工具
目录 一、概述1.1 版本信息:1.2 基本信息:1.2.1 软件支持的内容:1.2.2 支持的编码格式 1.3 软件界面图 二、代码实现2.1 View2.2 Controller2.3 Model 三、测试示例 一、概述 本工具居于hashlibPyQtQFileDialog写的小工具,主要是…...
【(数据结构)— 双向链表的实现】
(数据结构)— 双向链表的实现 一.双向链表的结构二. 双向链表的实现2.1 头文件 ——双向链表的创建及功能函数的定义2.2 源文件 ——双向链表的功能函数的实现2.3 源文件 ——双向链表功能的测试2.4 双向链表各项功能测试运行展示2.4.1 双向链表的初始化…...
酷克数据发布HD-SQL-LLaMA模型,开启数据分析“人人可及”新时代
随着行业数字化进入深水区,企业的关注点正在不断从“数字”价值转向“数智”价值。然而,传统数据分析的操作门槛与时间成本成为了掣肘数据价值释放的阻力。常规的数据分析流程复杂冗长,需要数据库管理员设计数据模型,数据工程师进…...
FL Studio21最新中文破解进阶高级完整版安装下载教程
目前水果软件最版本是FL Studio21,它让你的计算机就像是全功能的录音室,大混音盘,非常先进的制作工具,让你的音乐突破想象力的限制。喜欢音乐制作的小伙伴千万不要错过这个功能强大,安装便捷的音乐软件哦!如…...
MDN--Web性能
CSS 动画与 JavaScript 动画 动画的实现可以有很多种方式,比如 CSS transition 和 animation 或者基于 JavaScript 的动画(使用 requestAnimationFrame()) CSS 过渡和动画 CSS transiton :创建当前样式与结束状态样式之间的动画。尽管一个元素处于过渡状态中&…...
Vue3.js:自定义组件 v-model
Vue3的自定义v-model和vue2稍有不同 文档 https://cn.vuejs.org/guide/components/v-model.html 目录 原生组件自定义组件CustomInput实现代码1CustomInput实现代码2 v-model 的参数 原生组件 <input v-model"searchText" />等价于 <input:value"s…...
AI虚拟主播开发实战(附源码)
人工智能 文章目录 人工智能前言 前言 https://blog.csdn.net/icemanyandy/article/details/124035967...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
