LeetCode 1116. 打印零与奇偶数
假设有这么一个类:
class ZeroEvenOdd {public ZeroEvenOdd(int n) { ... } // 构造函数public void zero(printNumber) { ... } // 仅打印出 0public void even(printNumber) { ... } // 仅打印出 偶数public void odd(printNumber) { ... } // 仅打印出 奇数
}
相同的一个 ZeroEvenOdd 类实例将会传递给三个不同的线程:
线程 A 将调用 zero(),它只输出 0 。
线程 B 将调用 even(),它只输出偶数。
线程 C 将调用 odd(),它只输出奇数。
每个线程都有一个 printNumber 方法来输出一个整数。请修改给出的代码以输出整数序列 010203040506… ,其中序列的长度必须为 2n。
示例 1:
输入:n = 2
输出:“0102”
说明:三条线程异步执行,其中一个调用 zero(),另一个线程调用 even(),最后一个线程调用odd()。正确的输出为 “0102”。
示例 2:
输入:n = 5
输出:“0102030405”
方法一:Semaphore
class ZeroEvenOdd {private int n;Semaphore s1 = new Semaphore(1);Semaphore s2 = new Semaphore(0);Semaphore s3 = new Semaphore(0);public ZeroEvenOdd(int n) {this.n = n;}// printNumber.accept(x) outputs "x", where x is an integer.public void zero(IntConsumer printNumber) throws InterruptedException {for(int i = 1; i <= n; i++){s1.acquire();printNumber.accept(0);if((i & 1) == 1) s2.release();else s3.release();}}public void even(IntConsumer printNumber) throws InterruptedException {for(int i = 1; i <= n; i++){if((i & 1) == 0){s3.acquire();printNumber.accept(i);s1.release();}}}public void odd(IntConsumer printNumber) throws InterruptedException {for(int i = 1; i <= n; i++){if((i & 1) == 1){s2.acquire();printNumber.accept(i);s1.release();}}}
}
方法二:Thread.yield()
class ZeroEvenOdd {private int n;public int flag = 1;public ZeroEvenOdd(int n) {this.n = n;}// printNumber.accept(x) outputs "x", where x is an integer.public void zero(IntConsumer printNumber) throws InterruptedException {for(int i = 1; i <= n; i++){while(flag != 1)Thread.yield();printNumber.accept(0);if((i & 1) == 1) flag = 3;else flag = 2;}}public void even(IntConsumer printNumber) throws InterruptedException {for(int i = 1; i <= n; i++){if((i & 1) == 0){while(flag != 2)Thread.yield();printNumber.accept(i);flag = 1;}}}public void odd(IntConsumer printNumber) throws InterruptedException {for(int i = 1; i <= n; i++){if((i & 1) == 1){while(flag != 3)Thread.yield();printNumber.accept(i);flag = 1;}}}
}
方法三:synchronized
class ZeroEvenOdd {private int n;public int flag = 1;public ZeroEvenOdd(int n) {this.n = n;}// printNumber.accept(x) outputs "x", where x is an integer.public synchronized void zero(IntConsumer printNumber) throws InterruptedException {for(int i = 1; i <= n; i++){while(flag != 1)this.wait();printNumber.accept(0);if((i & 1) == 1) flag = 3;else flag = 2;this.notifyAll();}}public synchronized void even(IntConsumer printNumber) throws InterruptedException {for(int i = 1; i <= n; i++){if((i & 1) == 0){while(flag != 2)this.wait();printNumber.accept(i);flag = 1;this.notifyAll();}}}public synchronized void odd(IntConsumer printNumber) throws InterruptedException {for(int i = 1; i <= n; i++){if((i & 1) == 1){while(flag != 3)this.wait();printNumber.accept(i);flag = 1;this.notifyAll();}}}
}
方法四:ReentrantLock
class ZeroEvenOdd {private int n;public int flag = 1;ReentrantLock lock = new ReentrantLock();Condition c1 = lock.newCondition();Condition c2 = lock.newCondition();Condition c3 = lock.newCondition();public ZeroEvenOdd(int n) {this.n = n;}// printNumber.accept(x) outputs "x", where x is an integer.public void zero(IntConsumer printNumber) throws InterruptedException {lock.lock();try{for(int i = 1; i <= n; i++){while(flag != 1)c1.await();printNumber.accept(0);if((i & 1) == 1){flag = 3;c3.signal();}else{flag = 2;c2.signal();}c1.await();}}finally{lock.unlock();}}public void even(IntConsumer printNumber) throws InterruptedException {lock.lock();try{for(int i = 1; i <= n; i++){if((i & 1) == 0){while(flag != 2)c2.await();printNumber.accept(i);flag = 1;c1.signal();}}}finally{lock.unlock();}}public void odd(IntConsumer printNumber) throws InterruptedException {lock.lock();try{for(int i = 1; i <= n; i++){if((i & 1) == 1){while(flag != 3)c3.await();printNumber.accept(i);flag = 1;c1.signal();}}}finally{lock.unlock();}}
}
LeetCode 1116. 打印零与奇偶数相关推荐
- LeetCode 多线程 1116. 打印零与奇偶数
1116. 打印零与奇偶数 Ideas 有几个线程就用几个信号量,最先开始的信号量初始化为1,其它初始化为0,然后根据条件判断实现同步. 多线程的问题好多都是:锁自己,解锁别人. Code from ...
- LeetCode之打印零与奇偶数golang与java实现
1.题目 2.java锁思路 对于java可以采用一个锁和三个Condition来实现,用一个标志标识要打印0,不打印0时,zeroCondition await.然后用一个数字记录当前要打印的数,当 ...
- (多线程)leetcode1116. 打印零与奇偶数
假设有这么一个类: class ZeroEvenOdd { public ZeroEvenOdd(int n) { ... } // 构造函数 public void zero(pr ...
- 打印零与奇偶数 思路分析
1116. 打印零与奇偶数 假设有这么一个类: class ZeroEvenOdd {public ZeroEvenOdd(int n) { ... } // 构造函数public void zero ...
- 1119: 零起点学算法26——判断奇偶数
1119: 零起点学算法26--判断奇偶数 Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lld Submitted: 2419 ...
- 线程打印_面试题:用程序实现两个线程交替打印 0~100 的奇偶数
作者:dadiyang来源:https://blog.csdn.net/dadiyang/article/details/88315124 面试场景 面试官:Java多线程了解吗?你给我写一下,起两个 ...
- c语言利用线程交替打印奇偶数,两个线程交替打印奇偶数
序言 以前看过多线程交替打印奇偶数,知道大概怎么写,实际写的时候会卡住,特此记录下来 方法一:wait, notify,性能较差,不推荐使用 public class TestThread { pub ...
- java go多线程:两个线程交替打印 0~100 的奇偶数
最近在实现raft算法,用到了很多go的高并发的知识,看到一道题写两个线程交替打印 1~100 的奇偶数,突然来了兴趣. 题目要求我们要启动两个线程,一个打印奇数,一个打印偶数.中途不能跳出协程. 代 ...
- 课后作业--Python语言打印菱形(奇、偶数行效果)
上周留的Python作业觉着很值得写一篇帖子用来存放,它这就慢慢地走来咯~ 使用for循环.range函数和if else条件语句,打印奇数行.偶数行效果不一的菱形. 效果分析: 实现代码: #用户要 ...
最新文章
- javascript进制转换_44道JavaScript送命题
- PHP之提取多维数组指定列的方法
- 给你的杭州旅游攻略-愿你走出半生,归来仍是姑娘
- 简单介绍蓝牙无线模块和手机进行的车数据交互技巧
- IIS7日志文件位置
- 记录一次日志实现,基于log4j2
- 【电子相册制作软件】名编辑电子杂志大师教程 | 如何在翻页电子相册中添加动态的flash背景?
- 网站地图在线生成html,sitemap_网站地图_站点地图_在线生成_专注在线服务工具开发与同步部署 - sitemap 生成器...
- 量化策略回测DualThrust
- Jquery 模板插件 jquery.tmpl.js 的使用方法(2):嵌套each循环,temp调用(使用预编译的模板缓存)...
- 京东云引擎:免费好用的web应用托管平台
- 一个人年轻的时候,总以为疾病和死神只会光顾别人
- Tomcat下载以及IDEA配置Tomcat
- jQuery(javascript) 与Vue有什么区别
- 用word2003打开.docx文件
- CarSim仿真快速入门(十五)—CarSim传感器仿真之ADAS Sensor Objects (1)
- 程序员之禅的10条黄金法则
- pytorch安装教程 GPU版本
- 一文带你快速入门【哈希表】
- 如何进入他人计算机硬盘,手机如何访问电脑硬盘