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

代码如下:

import ("fmt""time"
)type Tongbu struct {selectChannel chan int
}
var wg sync.WaitGroup
func main(){wg.Add(2)tong:=Tongbu{}tong.selectChannel=make(chan struct{})go tong.printOld()go tong.printEvent()wg.wait()}// 打印奇数
func (tong *Tongbu)printOld(){defer wg.Done()for i:=0;i<100;i++{// 阻塞当前协程tong.selectChannel<-struct{}if i%2==1{fmt.Printf("奇数%v\n",i)}}return}
// 打印偶数
func (tong *Tongbu)printEvent(){defer wg.Done()for i:=0;i<101;i++{<-tong.selectChannelif i%2==0{fmt.Printf("偶数%v\n",i)}}return
}

java 实现
Java 实现两个线程交替打印0~100 的奇偶数,主要通过上锁。是线程1打印之后唤醒其他线程,然后让出锁,自己进入休眠状态。因为进入了休眠状态就不会与其他线程抢锁,此时只有线程2在获取锁,所以线程2必然会拿到锁。线程2以同样的逻辑执行,唤醒线程1并让出自己持有的锁,自己进入休眠状态。这样来来回回,持续执行直到任务完成。就达到了两个线程交替获取锁的效果了。

  private static int count=0;private static Object lock=new Object();public static void main(String[] args) {Thread odd = new Thread(() -> {while(count<=100){synchronized (lock){System.out.println(Thread.currentThread().getName()+":"+count++);lock.notifyAll();try {// 进行休眠,不争夺锁,等到另一个线程的唤醒if(count<=100)lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}, "偶数");Thread even = new Thread(() -> {while(count<=100){synchronized (lock){System.out.println(Thread.currentThread().getName()+":"+count++);lock.notifyAll();try {// 没有if 判断语句就会,就会一个线程一直阻塞if(count<=100)lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}, "奇数");odd.start();even.start();}

java go多线程:两个线程交替打印 0~100 的奇偶数相关推荐

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

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

  2. Java常见的面试算法题:实现两个线程交替打印1到100的数

    Java常见的面试算法题:实现两个线程交替打印1到100的数 思路: 这是涉及到多个线程打印的问题,一定会用到锁的(synchronized),故这就是一个多线程打印的典型案例. 代码实现: pack ...

  3. 使用Java线程并发库实现两个线程交替打印的线程题

    背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题.晚上闲着没事就决定把它实现出来. 题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交 ...

  4. Java两个线程交替打印奇偶数(两种方法对比)

    简介 本文将承接文章<Java多线程wait()和notify()系列方法使用教程>,我们将通过"两个线程交替打印100内的奇偶数",来展示下wait()方法和noti ...

  5. java让两个线程交替_java两个线程实现: 两个线程交替打印字母和数

    两个线程交替打印字母和数字: 1A2B3C4D5E6F7G public class LockConditionTest { public static void main(String[] args ...

  6. 如何让两个线程交替打印整数1-100?你的答案呢?

    前端时间下班临走前看到同事做尝试的一个题目:如何让两个线程交替打印整数1-100? 好几年没有写代码玩了,想了想,花了十多分钟写了个答案: #include<stdio.h> #inclu ...

  7. 线程打印_经典面试题——两个线程交替打印奇数和偶数

    前提 今天下班时候和同事聊天偶然听到面试题"两个线程交替打印奇数和偶数"的实现,这里做一个复盘. 复盘 场景一:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用对象监视 ...

  8. leet-code 两个线程交替打印FooBar

    文章目录 一.题目 二.原理解析 三.完整代码 四.代码优化 五.Java版实现 一.题目 交替打印FooBar 两个不同的线程将会共用一个 FooBar 实例.其中一个线程将会调用foo()方法,另 ...

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

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

最新文章

  1. python与anaconda区别_anaconda和python的区别是什么?
  2. Facebook数字货币凸显硅谷雄心:打造全球金融操作系统
  3. 一个Java程序员的阿里面试心得,附答案解析
  4. 派森编程软件python-零基础学习Python需要用什么开发工具?
  5. python 简单图像处理(8) 直方图均衡化
  6. Facebook 开启元宇宙模式!豪砸百亿是为什么?
  7. 运用js解决java selenium元素定位问题
  8. Keras——用Keras搭建RNN分类循环神经网络
  9. Ubuntu上面安装Mongo
  10. (6)数据结构-共享栈
  11. 大数据市场交易趋旺物联网平台争夺加剧
  12. android手机用Termux安装archlinux
  13. cruzer php sandisk 闪迪u盘量产工具_闪迪u3量产工具下载|
  14. 整数变百分数C语言,整数百分比
  15. indexof 的基本用法
  16. 视频倍速播放方法(有效!)
  17. 数据分析案例 |【01】电影数据分析
  18. 圣诞节礼物送什么有新意?高颜值蓝牙耳机可表心意
  19. uiautomatorviewer 简单使用
  20. 清明节出游图鉴:热门目的地的网络舆论与口碑分析

热门文章

  1. 在Unity(C#)中使用FFMPEG录制屏幕
  2. Windows如何升级go版本
  3. 玩转border-radius,用CSS来画一个花式流程图~
  4. [kali linux]-美化
  5. C语言 — 宏命令的使用
  6. 武汉理工大学计算机复试题,2017武汉理工计算机复试
  7. java关键字sizeof_sizeof()用法总结
  8. TC275——02板卡简单介绍
  9. 在Android上使用酷狗歌词API
  10. 基于 Springboot + Vue + Bootstrap 的电影票订票购票系统,可用于毕业设计、课程设计、练手学习