如果你对多线程的控制不怎么了解,那么理解了这篇文章的内容也许对你有帮助。鼓励先自己动手实现一遍,做不出来在看代码。
题目一:两个线程交替打印0~100的奇偶数
这道题就是说有两个线程,一个名为偶数线程,一个名为奇数线程,偶数线程只打印偶数,奇数线程只打印奇数,两个线程按顺序交替打印。本文重点不是说的这道题,这道题是下面那道题的简单版本,用来做个过渡。
效果图:
此题核心点就是如何控制多线程的执行顺序,我们知道C#的System.Threading命名空间给开发者提供了控制线程相关的对象,线程同步常用对象有:Semaphore,ManualResetEvent,AutoResetEvent,这里我用AutoResetEvent来实现,代码如下:
我这里是两个线程调用不同的方法实现,可读性会好点,如果只调用一个同样的方法你们会怎么实现呢?
题目二:通过N个线程顺序循环打印0~100
这篇文章主要是说这道题,此题据称是阿里的面试题,具体效果如下:
通过N个线程顺序循环打印从0至100,如给定N=3则输出:
这个题开始真没想出来,后来无意在github上有人用Java做出了答案,看到使用了Semaphore去控制,我就用C#代码做了下,代码如下:
如果现实面试我第一次碰上了这样的题目,估计是答不上来了,那么你们觉得出这样难度面试题的公司月薪给多少K合适?
完整代码:https://github.com/Ax0ne/Example.Leetcode/blob/master/src/Example.Leetcode/Problems/ThreadExample.cs 欢迎star哟,后面会陆续添加一些有意思的题目代码。
博友们还能有不同的实现方式吗 ? ^_^
static
int
threadCount = 4;
static
int
cursorId = 0;
static
object
cursorLock =
new
object
();
static
void
Main(
string
[] args)
{
for
(
int
threadIndex = 0; threadIndex < threadCount; threadIndex++)
{
ThreadPool.QueueUserWorkItem(
new
WaitCallback(PrintNum), threadIndex);
}
Console.ReadKey();
}
static
void
PrintNum(
object
index)
{
bool
breakNow =
false
;
while
(!breakNow)
{
Monitor.Enter(cursorLock);
if
(cursorId > 100)
{
breakNow =
true
;
}
else
if
(cursorId % threadCount == (
int
)index)
{
Console.WriteLine($
"ThreadID={Thread.CurrentThread.ManagedThreadId}, {cursorId}"
);
cursorId++;
}
Monitor.Exit(cursorLock);
}
Console.WriteLine($
"ThreadID={Thread.CurrentThread.ManagedThreadId}, over."
);
}