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

作者:dadiyang来源:https://blog.csdn.net/dadiyang/article/details/88315124

面试场景

面试官:Java多线程了解吗?你给我写一下,起两个线程交替打印0~100的奇偶数。

小黄:啊?

面试官:就是有两个线程,一个线程打印奇数另一个打印偶数,它们交替输出,类似这样。

偶线程:0奇线程:1偶线程:2……奇线程:99偶线程:100

小黄:啊?

面试官:……嗯。好的。回去等通知吧。

解说

遇到这种突如其来的面试题,有时候会让人无从下手。尽管可能你学习过多线程的知识,但是面试官抛一个问题过来,短时间内可能想不出如何使用这些知识来解决这个具体的问题。其实这个问题考察的知识点并不难,但是如果准备的面试的时候没有看过这道题,一时间还是比较难想出解决方案来的,而且这种题往往是让面试者手写代码。

回到题目上来。首先是两个线程,其次是交替打印。这可以联系到线程之间的通信问题。这时可以想到大致的方向就是加锁,哪个线程拿到锁就打印,然后释放锁让另一个线程获取锁。两个线程轮流拿到锁,实现交替打印的效果。

起两个线程大家都会,加锁也简单,问题是如何让这两个线程轮流拿到锁呢?我们知道,加锁之后线程之前相互竞争锁,而Java默认是不保证锁的公平性的(使用公平锁可能也是一个思路),这就有可能出现同一个线程一直打印而另一个线程一直没有打印的情况。

讨巧的方案

比较容易想的一个方案是,要输出的时候判断一下当前需要输出的数是不是自己要负责打印的值,如果是就输出,不是就直接释放锁。

a39e6c4fefe7a4d45f9a80b0b6a46cfc.png

输出结果如下。

偶数: 0奇数: 1偶数: 2……奇数: 99偶数: 100

从输出上看,是实现了题目上的要求,两个线程,一个打印奇数,一个打印偶数,轮流输出。但只是用了一个讨巧的方式避开了线程交替获取锁的需求,明显没有答到面试官想考察的考点上。而且效率较低,如果同一个线程一直抢到锁,而另一个线程一直没有拿到,就会导致线程做很多无谓的空转。那么有没有更好的解决方案,让两个线程严格地交替获取到锁呢?

交替获取锁的方案

6ce661b788451ee3497e990bc541a8e6.png
d5911fdfd33495533e5e11f061dfdf6b.png

上面为了直观起见,我将两个线程都独立写了出来,其实 Thead 中的代码是相同的,可以抽成一个 Runnable 类。

a8840416ea5ea85daf9a8faf7b81413d.png

输出结果如下。

偶数: 0奇数: 1偶数: 2……奇数: 99偶数: 100

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

至此,本题解决。

扩展

两个线程交替打印的问题解决了,让我们来扩展一下,如果有三个线程,要求让它们交替输出 1、2、3,即。

线程1:1线程2:2线程3:3线程1:1线程2:2线程3:3……

这种情况要怎么解决呢?欢迎留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net添加删除表格_如何用openpyxl自动化编写Excel电子表格

有很多不同的东西你可以写到电子表格,从简单的文本或数字值到复杂的公式,图表,甚至图像。创建一个简单的电子表格之前,大家看到了一个非常快速的例子,就是如何将 "Hello world!"写进电子表格中,所…

纯css3实现的鼠标悬停动画按钮

今天给大家带来一款纯css3实现的鼠标悬停动画按钮。这款按钮鼠标经过前以正方形的形式&#xff0c;当鼠标经过的时候以动画的形式变成圆形。效果图如下&#xff1a; 在线预览 源码下载 实现的代码。 html代码&#xff1a; <div><span></span></div> …

如何交到一个女朋友?

1 北京的路&#xff0c;上海的路和重庆的路2 这兔子是吃弹簧长大的吧&#xff01;3 猫和老鼠原来是真的4 把水凝胶珠投入有颜色的水&#xff0c;过一会儿之后...5 为了同学得分&#xff0c;老师有多努力你知道吗&#xff1f;6 不同年龄段爱用的表情7 来自一个幼儿园小男生的教学…

浅析 Dapr 里的云计算设计模式

Dapr 实际上是把分布式系统 与微服务架构实践的挑战以及k8s 这三个主题的全方位的设计组合&#xff0c;特别是Kubernetes设计模式 一书作者Bilgin Ibryam 提出的Multi-Runtime Microservices Architecture&#xff0c;中译参见敖小剑的博客: [译] 多运行时微服务架构。分布式系…

Linux Kickstart无人值守安装(上)

Linux Kickstart无人值守安装 在我们的网络维护生涯中&#xff0c;有不少朋友&#xff0c;感觉到自己在机械的做一件事情&#xff0c;在无聊、无趣和无奈中工作。尤其一些简单重复的操作更容易让大家感到工作的无趣。今天将给大家介绍如何大规模的部署RedHat Linux操作系统&…

path manipulation怎么解决_干货!终于!解决macOS下pyenv安装python3.8.2缺少tkinter模块的问题!...

前言&#xff1a;笔者不过是一个刚立下flag要学习Python的小白&#xff0c;&#xff08;这也是笔者的第一篇网文、知乎文&#xff0c;如果没用&#xff0c;求轻虐&#xff09;&#xff0c;为此还冲动傻傻地配了一台2019款13寸的MacBook Pro。电脑配置&#xff08;作为参考&…

如何给柱状图柱子添加阴影_【LeetCode日记】84. 柱状图中最大的矩形

题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。以上是柱状图的示例&#xff0c;其中每个柱子的宽度为 1&#xff0c;给定的高度为 [2,1,5,6,2…

VMWare虚拟机NAT上网方法 亲测可用

首先虚拟机的网卡要选择NAT 然后 在Virtual Network Editor中一定选上DHCP功能。 还要主机的服务必须开启。主机的VMnet8对应NAT模式&#xff0c;这个VMnet8的配置保持默认不要改&#xff0c;默认会有IP&#xff0c;不要设置成自动获取。 在虚拟机Windows系统的网卡设置必须自动…

用MATLAB三步完成机器人搭建

全世界只有3.14 % 的人关注了爆炸吧知识如果说机器人是一粒种子&#xff0c;那么《机器人大擂台》这档节目就是那个播种人。节目中&#xff0c;不同选手操纵着机器人&#xff0c;在擂台上各显神威 —— 冲撞、翻滚、撬杠、喷火等各种技能&#xff0c;总能令人眼花缭乱&#xff…

可以备份服务器文件的软件哪个好,文件备份软件哪个好?

对于一个企业而言&#xff0c;文件的价值是无可比拟的&#xff0c;无论是重要的文件、文档还是会议记录等等都是不可丢失的。一般而言&#xff0c;企业为了让文件更加安全&#xff0c;会进行文件的备份&#xff0c;企业文件备份传统方式就是租用或者购买一台服务器来进行数据或…

太妙了!微软670页《dotnet官方手册》火了,完整PDF开放下载!

本文档由微软技术专家编写&#xff0c;从1.1版本持续维护升级至今&#xff0c;开篇就详细对比了各版本中的差异&#xff0c;内容包含了ASP.NET Core、Blazor、WebAPI、SignalR、gRPC、EF Core、云原生&#xff0c;既是最权威的&#xff0c;也是最全面的&#xff0c;是学习跨平台…

(译)如何使用cocos2d制作基于tile地图的游戏教程:第一部分

免责申明&#xff08;必读&#xff01;&#xff09;&#xff1a;本博客提供的所有教程的翻译原稿均来自于互联网&#xff0c;仅供学习交流之用&#xff0c;切勿进行商业传播。同时&#xff0c;转载时不要移除本申明。如产生任何纠纷&#xff0c;均与本博客所有人、发表该翻译稿…

devexpress 中的checkboxlist怎么设置间距_HTML中怎么设置h1的字体样式你知道吗?关于设置h1标签的样式详解

本篇文章主要为大家讲解了html中的h1标签的样式解析&#xff0c;但是如果不用css样式来做的话&#xff0c;那就只能在html4.01中显示了&#xff0c;所以我们还是尽快学习css层叠样式表吧&#xff0c;好了&#xff0c;现在让我们来说说这篇文章吧。HTML中的H标签(H1&#xff0c;…

终端如何粘贴快捷键_11 个“原来可以这样”的 Linux 终端命令

1. 命令行日常系快捷键如下的快捷方式非常有用&#xff0c;能够极大的提升你的工作效率&#xff1a;CTRL U - 剪切光标前的内容CTRL K - 剪切光标至行末的内容CTRL Y - 粘贴CTRL E - 移动光标到行末CTRL A - 移动光标到行首ALT F - 跳向下一个空格ALT B - 跳回上一个空格…

2020应届生「求职图鉴」,扎心了!

一场疫情&#xff0c;开启了2020应届生求职的地狱模式&#xff1a;实习&#xff0c;辞了考研&#xff0c;凉了论文&#xff0c;废了春招&#xff0c;歇了......别说拿高薪&#xff0c;有份工作都难&#xff01;当「想象」遇上「现实」&#xff0c;现在的你&#xff0c;还挺得住…

WCF发布到IIS7问题的解决方案

今天用VS2010开发了一个WCF服务进行一个简单测试&#xff0c;没想到这点小事竟然折腾了我2个小时。 为避免其他兄弟遇到相同的问题少走弯路做一下总结。 操作系统:Windows7 旗舰版 开发环境:VS2010 .NET Framework4.0 ASP.NET4.0 第一步&#xff1a;检查Windows7中IIS是否安装了…

flex布局_Flex布局,真香

作者: EcbJS https://blog.csdn.net/EcbJS/article/details/106466757?utm_sourceapp1.基本原理Flex 英文意思为&#xff0c;弯曲&#xff0c;屈伸&#xff0c;可以伸缩的布局&#xff0c;天生就是为了适配不同的分辨率。而且用法也很简单&#xff0c;首先只要告诉浏览器&…

字体编辑器_FontLab 7 ——字体编辑器

FontLab VI是一款专为Mac用户设计的字体编辑器。无论您是专家还是初学者&#xff0c;使用FontLab突破性的绘图工具和响应式轮廓操作都能够轻松设计&#xff0c;编辑和转换字体&#xff0c;让您的设计过程将更快&#xff0c;更高效&#xff01;功能介绍一、画画 下一代绘图神器&…

分享一个理工男必学的撩妹姿势

随着气温越来越高&#xff0c;空气中恋爱的酸臭味也越来越浓。。。是的&#xff0c;这意味着一个由谐音演变而来的“传统佳节”&#xff0c;也终于迎来了它的高光时刻。520可以说是每个直男都要经历的考验&#xff0c;说是“我爱你”的谐音&#xff0c;过得好是520&#xff0c;…

Docker小白到实战之Dockerfile解析及实战演示,果然顺手

前言使用第三方镜像肯定不是学习Docker的最终目的&#xff0c;最想要的还是自己构建镜像&#xff1b;将自己的程序、文件、环境等构建成自己想要的应用镜像&#xff0c;方便后续部署、启动和维护&#xff1b;而Dockerfile就是专门做这个事的&#xff0c;通过类似简单编码的形式…