假设有这么一个类:

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. 打印零与奇偶数相关推荐

  1. LeetCode 多线程 1116. 打印零与奇偶数

    1116. 打印零与奇偶数 Ideas 有几个线程就用几个信号量,最先开始的信号量初始化为1,其它初始化为0,然后根据条件判断实现同步. 多线程的问题好多都是:锁自己,解锁别人. Code from ...

  2. LeetCode之打印零与奇偶数golang与java实现

    1.题目 2.java锁思路 对于java可以采用一个锁和三个Condition来实现,用一个标志标识要打印0,不打印0时,zeroCondition await.然后用一个数字记录当前要打印的数,当 ...

  3. (多线程)leetcode1116. 打印零与奇偶数

    假设有这么一个类: class ZeroEvenOdd {   public ZeroEvenOdd(int n) { ... }      // 构造函数   public void zero(pr ...

  4. 打印零与奇偶数 思路分析

    1116. 打印零与奇偶数 假设有这么一个类: class ZeroEvenOdd {public ZeroEvenOdd(int n) { ... } // 构造函数public void zero ...

  5. 1119: 零起点学算法26——判断奇偶数

    1119: 零起点学算法26--判断奇偶数 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lld Submitted: 2419 ...

  6. 线程打印_面试题:用程序实现两个线程交替打印 0~100 的奇偶数

    作者:dadiyang来源:https://blog.csdn.net/dadiyang/article/details/88315124 面试场景 面试官:Java多线程了解吗?你给我写一下,起两个 ...

  7. c语言利用线程交替打印奇偶数,两个线程交替打印奇偶数

    序言 以前看过多线程交替打印奇偶数,知道大概怎么写,实际写的时候会卡住,特此记录下来 方法一:wait, notify,性能较差,不推荐使用 public class TestThread { pub ...

  8. java go多线程:两个线程交替打印 0~100 的奇偶数

    最近在实现raft算法,用到了很多go的高并发的知识,看到一道题写两个线程交替打印 1~100 的奇偶数,突然来了兴趣. 题目要求我们要启动两个线程,一个打印奇数,一个打印偶数.中途不能跳出协程. 代 ...

  9. 课后作业--Python语言打印菱形(奇、偶数行效果)

    上周留的Python作业觉着很值得写一篇帖子用来存放,它这就慢慢地走来咯~ 使用for循环.range函数和if else条件语句,打印奇数行.偶数行效果不一的菱形. 效果分析: 实现代码: #用户要 ...

最新文章

  1. javascript进制转换_44道JavaScript送命题
  2. PHP之提取多维数组指定列的方法
  3. 给你的杭州旅游攻略-愿你走出半生,归来仍是姑娘
  4. 简单介绍蓝牙无线模块和手机进行的车数据交互技巧
  5. IIS7日志文件位置
  6. 记录一次日志实现,基于log4j2
  7. 【电子相册制作软件】名编辑电子杂志大师教程 | 如何在翻页电子相册中添加动态的flash背景?
  8. 网站地图在线生成html,sitemap_网站地图_站点地图_在线生成_专注在线服务工具开发与同步部署 - sitemap 生成器...
  9. 量化策略回测DualThrust
  10. Jquery 模板插件 jquery.tmpl.js 的使用方法(2):嵌套each循环,temp调用(使用预编译的模板缓存)...
  11. 京东云引擎:免费好用的web应用托管平台
  12. 一个人年轻的时候,总以为疾病和死神只会光顾别人
  13. Tomcat下载以及IDEA配置Tomcat
  14. jQuery(javascript) 与Vue有什么区别
  15. 用word2003打开.docx文件
  16. CarSim仿真快速入门(十五)—CarSim传感器仿真之ADAS Sensor Objects (1)
  17. 程序员之禅的10条黄金法则
  18. pytorch安装教程 GPU版本
  19. 一文带你快速入门【哈希表】
  20. 如何进入他人计算机硬盘,手机如何访问电脑硬盘

热门文章

  1. XML Barcode Webservice条形码控件介绍
  2. Ubuntu 10.4速配指南
  3. [Lintcode]102. Linked List Cycle/[Leetcode]
  4. Spring使用注解方式的学习笔记
  5. 深入解析alloc/retain/release/dealloc实现
  6. 关于简历和面试【整理自知乎】
  7. CQOI 2016 不同的最小割
  8. Batman崛起之地——Gotham
  9. 一步步构建大型网站架构(转载)
  10. 一张以你为中心的地图