1.题目

2.java锁思路

对于java可以采用一个锁和三个Condition来实现,用一个标志标识要打印0,不打印0时,zeroCondition await。然后用一个数字记录当前要打印的数,当该数为奇数时,signal打印奇数的,否则,signal打印偶数的。
类代码:

class ZeroEvenOdd {private int n;private int num = 1;private boolean flag = true;//是否打印0Lock lock = new ReentrantLock();Condition zeroConditon = lock.newCondition();Condition evenConditon = lock.newCondition();Condition oddConditon = 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 {for (int i = 0; i < n; i++) {lock.lock();while (!flag) {zeroConditon.await();}printNumber.accept(0);if (this.num % 2 == 0) {evenConditon.signal();} else {oddConditon.signal();}flag = false;lock.unlock();}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i = 2; i <= n; i += 2) {lock.lock();while (flag || num %2 ==1) {evenConditon.await();}printNumber.accept(num);zeroConditon.signal();flag = true;num++;lock.unlock();}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i += 2) {lock.lock();while (flag || num %2 ==0) {oddConditon.await();}printNumber.accept(i);zeroConditon.signal();flag = true;num++;lock.unlock();}}
}

本地测试代码:

class IntConsumer {public static void main(String[] args) {IntConsumer consumer = new IntConsumer();ZeroEvenOdd odd = new ZeroEvenOdd(50);new Thread(new Runnable() {@Overridepublic void run() {try{odd.zero(consumer);}catch (Exception e){}}}).start();new Thread(new Runnable() {@Overridepublic void run() {try{odd.even(consumer);}catch (Exception e){}}}).start();new Thread(new Runnable() {@Overridepublic void run() {try{odd.odd(consumer);}catch (Exception e){}}}).start();}public void accept(int x) {System.out.print(x);}
}

本地测试结果

3.golang channel思路

可以采用三个chan进行通信来解决,开始时,主线程发送消息先打印0,然后zero协程根据传送的数是偶数还是奇数向奇数协程或偶数协程发送消息。奇数或偶数协程收到消息后,打印消息,让该数++,再发送给zero协程。

func main() {consumer := new(IntConsumer)zeroEvenOdd := new(ZeroEvenOdd)zeroEvenOdd.N = 50c1 := make(chan int)//代表打印0的通道c2 := make(chan int)//代表打印偶数的通道c3 := make(chan int)//代表打印奇数的通道//启动三个协程go func() {zeroEvenOdd.Zero(consumer, c1, c2, c3)}()go func() {zeroEvenOdd.Even(consumer, c1, c2, c3)}()go func() {zeroEvenOdd.Odd(consumer, c1, c2, c3)}()c1 <- 1//启动打印0time.Sleep(10 * time.Second)
}type IntConsumer struct {}func (c *IntConsumer) Accept(x int) {fmt.Print(x)
}type ZeroEvenOdd struct {N int
}func (self *ZeroEvenOdd) Zero(consumer *IntConsumer, c1, c2, c3 chan int) {for i := 0; i < self.N; i++ {select {case num := <-c1:consumer.Accept(0)if num%2 == 0 {c2 <- num} else {c3 <- num}}}
}func (self *ZeroEvenOdd) Odd(consumer *IntConsumer, c1, c2, c3 chan int) {for i := 1; i <= self.N; i += 2 {select {case num := <-c3:consumer.Accept(num)num++c1 <- num}}
}func (self *ZeroEvenOdd) Even(consumer *IntConsumer, c1, c2, c3 chan int) {for i := 2; i <= self.N; i += 2 {select {case num := <-c2:consumer.Accept(num)num++c1 <- num}}
}

打印结果:

LeetCode之打印零与奇偶数golang与java实现相关推荐

  1. LeetCode 1116. 打印零与奇偶数

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 优达学城python项目P1:搜索和探索近地天体(NEOs)
  2. 【Linux系统编程】线程池
  3. FZU - 2202 犯罪嫌疑人(逻辑思维+简单模拟)
  4. TensorLayer MNIST
  5. 为进阶Linux大佬打牢地基
  6. 解决 fprintd-0.1-19.git04fd09cfa.el6 crash问题
  7. 判断两个结构体是否相等
  8. oracle12c多个pdb,ProxmoxVE 之 oracle12C 多CDB和PDB
  9. 商家 APP 如何接入新版支付宝支付,老版本商家如何升级
  10. UI实用素材|购物车界面不同设计,可临摹的好模板
  11. _stdcall与_cdecl的区别
  12. 【贪心】hdu5969 最大的位或
  13. 音视频开发著作《Android音视频开发》终于发售了,先来一波签名送书福利!
  14. 【截屏、录屏】工具分享-最简单的工具-QQ
  15. 基于redis的简易单点登录系统
  16. 思维导向树6级节点_树形图或思维导图类似的数据结构中如何删除特定节点?
  17. 肇庆学院计算机选修旷课,化学化工学院考查课管理办法(试行)
  18. Python网页应用开发神器fac框架正式发布
  19. 小白也能学会装“win10系统”,轻松撩妹
  20. python3 文件重命名_Python3 os.rename() 方法

热门文章

  1. Assignment 2: UDP Pinger[课后作业]
  2. Unity Shader入门学习(1):基础shader
  3. com.amap.api.services.core.AMapException: ***确保调用SDK任何接口前先调用更新 3dmap: 隐私合规校验失败
  4. 2019.12.18
  5. 电视2k和4k有什么区别
  6. MATLAB教程(1) MATLAB 基础知识
  7. HTC VIVE☀️五、手柄与UI碰撞交互,手柄按键高亮、显示文字提示
  8. Get请求,参数为@RequestBody的http请求
  9. 手机损坏的数据导出方法
  10. 英国只能设置A记录且无法更改的免费二级域名