一道有意思的多线程面试题 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 ...
随机推荐
- 免费的馅饼 HYSBZ - 2131 (树状数组维护二维偏序)
题目链接:https://cn.vjudge.net/problem/HYSBZ-2131 题目大意:中文题目 具体思路:对于任意的两个位置,posA和posB,我们可以如下推导. |posA-pos ...
- Django CSRF提交遇见的问题
简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功能有 ...
- shiro与Web项目整合-Spring+SpringMVC+Mybatis+Shiro(八)
Jar包
- 对HUAWEI-ManagedProvisioning的一次不完整分析
分析思路 关注点1:AndroidManifest.xml是Android应用的入口文件,包含有APP服务的权限.广播和启动位置. 关注点2:涉及到修改系统的函数,setWifiEnabled().I ...
- fnmatch模块的使用
fnmatch模块的使用 此模块的主要作用是文件名称的匹配,并且匹配的模式使用的unix shell风格.fnmatch比较简单就4个方法分别是:fnmatch,fnmatchcase,filter, ...
- 用conda管理Python包
用conda管理Python包 conda是一个很好的包管理工具,在用了Anaconda之后一直不知道怎么用conda进行管理,其实很简单,就是没人教,慢慢自己摸索了一点.直接在Anaconda的命令 ...
- zabbix3.0.4添加对指定进程的监控
zabbix3.0.4添加对进程的监控: 主要思路: 通过 ps -ef|grep sdk-push-1.0.0.jar |grep -v grep|wc -l 这个命令来判断进程sdk-push是否 ...
- Android用户界面开发:TabHost
TabHost是整个Tab的容器,包括两部分,TabWidget和FrameLayout.TabWidget就是每个tab的标签,FrameLayout则是tab内容.TabHost的二种实现方式:第 ...
- python 运行日志logging代替方案
以下是自己写的 记录日志的代码.(和logging不搭嘎,如果如要学loggging模块,本文末尾有他人的链接.) # prtlog.py ############################## ...
- LeetCode(61):旋转链表
Medium! 题目描述: 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, ...