一道有意思的多线程面试题 C# 代码实现
如果你对多线程的控制不怎么了解,那么理解了这篇文章的内容也许对你有帮助。鼓励先自己动手实现一遍,做不出来在看代码。
题目一:两个线程交替打印0~100的奇偶数
这道题就是说有两个线程,一个名为偶数线程,一个名为奇数线程,偶数线程只打印偶数,奇数线程只打印奇数,两个线程按顺序交替打印。本文重点不是说的这道题,这道题是下面那道题的简单版本,用来做个过渡。
效果图:

此题核心点就是如何控制多线程的执行顺序,我们知道C#的System.Threading命名空间给开发者提供了控制线程相关的对象,线程同步常用对象有:Semaphore,ManualResetEvent,AutoResetEvent,这里我用AutoResetEvent来实现,代码如下:
public class ThreadExample
{
/// <summary>
/// 两个线程交替打印0~100的奇偶数
/// </summary>
public static void PrintOddEvenNumber()
{
var work = new TheadWorkTest();
var thread1 = new Thread(work.PrintOddNumer) { Name = "奇数线程" };
var thread2 = new Thread(work.PrintEvenNumber) { Name = "偶数线程" };
thread1.Start();
thread2.Start();
}
} public class TheadWorkTest
{
private static readonly AutoResetEvent oddAre = new AutoResetEvent(false);
private static readonly AutoResetEvent evenAre = new AutoResetEvent(false); public void PrintOddNumer()
{
oddAre.WaitOne();
for (var i = ; i < ; i++)
{
if (i % != ) continue;
Console.WriteLine($"{Thread.CurrentThread.Name}:{i}");
evenAre.Set();
oddAre.WaitOne();
}
} public void PrintEvenNumber()
{
for (var i = ; i < ; i++)
{
if (i % != ) continue;
Console.WriteLine($"{Thread.CurrentThread.Name}:{i}");
oddAre.Set();
evenAre.WaitOne();
}
}
}
我这里是两个线程调用不同的方法实现,可读性会好点,如果只调用一个同样的方法你们会怎么实现呢?
题目二:通过N个线程顺序循环打印0~100
这篇文章主要是说这道题,此题据称是阿里的面试题,具体效果如下:
通过N个线程顺序循环打印从0至100,如给定N=3则输出:

这个题开始真没想出来,后来无意在github上有人用Java做出了答案,看到使用了Semaphore去控制,我就用C#代码做了下,代码如下:
public class ThreadExample
{ /// <summary>
/// N个线程顺序循环打印从0至100
/// </summary>
/// <param name="n"></param>
public static void PrintNumber(int n = )
{
var work = new TheadWorkTest { Semaphores = new Semaphore[n] };
for (var i = ; i < n; i++)
{
work.Semaphores[i] = new Semaphore(, );
if (i != n - )
work.Semaphores[i].WaitOne();
}
for (var i = ; i < n; i++)
{
new Thread(work.PrintNumber) { Name = "线程" + i }.Start(i);
}
}
} public class TheadWorkTest
{
public Semaphore[] Semaphores { get; set; }
public static int index;
public void PrintNumber(object c)
{
var i = Convert.ToInt32(c);
var preSemaphore = i == ? Semaphores[Semaphores.Length - ] : Semaphores[i - ];
var curSemaphore = Semaphores[i];
while (true)
{
preSemaphore.WaitOne();
Interlocked.Increment(ref index);
if (index > )
return;
Console.WriteLine($"{Thread.CurrentThread.Name}:{index}");
curSemaphore.Release();
}
}
}
如果现实面试我第一次碰上了这样的题目,估计是答不上来了,那么你们觉得出这样难度面试题的公司月薪给多少K合适?
完整代码:https://github.com/Ax0ne/Example.Leetcode/blob/master/src/Example.Leetcode/Problems/ThreadExample.cs 欢迎star哟,后面会陆续添加一些有意思的题目代码。
博友们还能有不同的实现方式吗 ? ^_^
一道有意思的多线程面试题 C# 代码实现的更多相关文章
- 一道有意思的 CSS 面试题,FizzBuzz ~
FizzBuzz 是一道很有意思的题目.我们来看看题目: 如果遇见了 3 的倍数要说 Fizz,5 的倍数就说 Buzz,如果即是 3 的倍数又是 5 的倍数就说 FizzBuzz. 如果是在一些 ...
- 15个顶级Java多线程面试题及回答
Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程 的问题.在投资银行业务中多线程和并发 ...
- 一线大厂面试官最喜欢问的15道Java多线程面试题
前言 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得更多职位,那么你应该准备很多关于多线程的问题. 他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者 ...
- 程序员Java架构师多线程面试题和回答解析
当我们在Java架构师面试的过程中常见的多线程和并发方面的问题肯定是必不可少的一部分.那么在面试之前我们更应该多准备一些关于多线程方面的问题. 面试官只是想确信面试者有足够的Java线程与并发方面的知 ...
- 新鲜出炉!面试90%会被问到的Java多线程面试题,史上最全系列!
前言 最近很多粉丝朋友私聊我说能不能给整理出一份多线程面试题出来,说自己在最近的面试中老是被问到这一块的问题被问的很烦躁,前一段时间比较忙没时间回私信,前两天看到私信我也是赶紧花了两天给大家整理出这一 ...
- 15个顶级Java多线程面试题及答案
1)现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉.这个多线程问题比 ...
- java多线程面试题整理及回答
1)现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉.这个多线程问题比 ...
- 【OD深入学习】Java多线程面试题
一.参考文章 1. Java线程面试题 Top 50 2. Java面试——多线程面试题 3. JAVA多线程和并发基础面试问答 4. 15个顶级Java多线程面试题及回答 二.逐个解答 三.一语中的 ...
- Java面试——多线程面试题总结
)两者都在等待对方所持有但是双方都不释放的锁,这时便会一直阻塞形成死锁. //存放两个资源等待被使用 public class Resource { public static Object obj1 ...
随机推荐
- 移动前端框架,require.js压缩
static css images 不同的页面可以新建不同的图片文件夹(可选) js libs 前端类库 plugs 插件 views 自己写的代码文件 sass/less l ...
- VS Code中Matlab插件安装设置
Install the extension in VS Code Open the command palette using Ctrl+Shift+P Type ext install Matlab ...
- ROS学习笔记(二) # ROS NodeHandles
1. 自动启动和关闭 ros::NodeHandle nh: 这段代码执行之后,如果内部节点还没有启动,ros::NodeHandle 会启动这个节点:一旦所有的 ros::NodeHandle 实例 ...
- K-means聚类算法原理和C++实现
给定训练集$\{x^{(1)},...,x^{(m)}\}$,想把这些样本分成不同的子集,即聚类,$x^{(i)}\in\mathbb{R^{n}}$,但是这是个无标签数据集,也就是说我们再聚类的时候 ...
- python模块分析之logging日志(四)
前言 python的logging模块是用来设置日志的,是python的标准模块. 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块 ...
- Device Tree常用方法解析【转】
转自:https://blog.csdn.net/airk000/article/details/21345159 Device Tree常用方法解析 Device Tree在Linux内核驱动中的使 ...
- MySQL版本升级参考资料【转】
MySQL升级参考资料 MySQL 升级的最佳实践 - 技术翻译 - 开源中国社区https://www.oschina.net/translate/mysql-upgrade-best-practi ...
- nodejs 使用mysql 进行查询的问题
因为返回的是个对象 var selectSql1="select * from spc_word_mst where WORD_ID=? limit 0,1 "var select ...
- openstack swift节点安装手册1-节点配置
本文参照官方教程:http://docs.openstack.org/project-install-guide/object-storage/draft/environment-networking ...
- eclipse里访问tomcat首页出现404错误解决之法
首先,添加Tomcat.在菜单栏找到Window—Preferences—Server—Runtime Environments—Add—Apache—选择Tomcat版本—找到Tomcat文件的路径 ...