VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#教程 >
  • C#教程之C#教程之一道有意思的多线程面试题 C# 代码实现

本站最新发布   C#从入门到精通
试听地址  
https://www.xin3721.com/eschool/CSharpxin3721/

如果你对多线程的控制不怎么了解,那么理解了这篇文章的内容也许对你有帮助。鼓励先自己动手实现一遍,做不出来在看代码。

 

题目一:两个线程交替打印0~100的奇偶数

这道题就是说有两个线程,一个名为偶数线程,一个名为奇数线程,偶数线程只打印偶数,奇数线程只打印奇数,两个线程按顺序交替打印。本文重点不是说的这道题,这道题是下面那道题的简单版本,用来做个过渡。

效果图:

此题核心点就是如何控制多线程的执行顺序,我们知道C#的System.Threading命名空间给开发者提供了控制线程相关的对象,线程同步常用对象有:Semaphore,ManualResetEvent,AutoResetEvent,这里我用AutoResetEvent来实现,代码如下:

 View Code

我这里是两个线程调用不同的方法实现,可读性会好点,如果只调用一个同样的方法你们会怎么实现呢?

题目二:通过N个线程顺序循环打印0~100

这篇文章主要是说这道题,此题据称是阿里的面试题,具体效果如下:

通过N个线程顺序循环打印从0至100,如给定N=3则输出:

 这个题开始真没想出来,后来无意在github上有人用Java做出了答案,看到使用了Semaphore去控制,我就用C#代码做了下,代码如下:

 View Code

 

如果现实面试我第一次碰上了这样的题目,估计是答不上来了,那么你们觉得出这样难度面试题的公司月薪给多少K合适?

完整代码:https://github.com/Ax0ne/Example.Leetcode/blob/master/src/Example.Leetcode/Problems/ThreadExample.cs  欢迎star哟,后面会陆续添加一些有意思的题目代码。

博友们还能有不同的实现方式吗 ? ^_^

 
 
标签: 多线程
好文要顶 关注我 收藏该文  
Ax0ne
关注 - 4
粉丝 - 8
 
 
+加关注
7
0
 
 
 
« 上一篇:Visual Studio 2013 如何关闭调试而不关闭IIS Express
posted @ 2019-03-21 19:07 Ax0ne 阅读(1024) 评论(10) 编辑 收藏
 

 
  
#1楼 2019-03-21 23:50 皮特胖胖  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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.");
}
相关教程