请选择 进入手机版 | 继续访问电脑版

马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

一道有意思的多线程面试题 C# 代码实现

[复制链接]
查看2378 | 回复0 | 2019-8-15 11:40:02 | 显示全部楼层 |阅读模式

文章转载自:http://www.pythonheidong.com/blog/article/2553/

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

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

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

效果图:

114503xdtkukhoazbak4xx.png

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

114504iiazgiic42cgpz00.gif
114504oytxgm1z9923t9t1.gif
  1. public class ThreadExample
  2. {
  3. /// <summary>
  4. /// 两个线程交替打印0~100的奇偶数
  5. /// </summary>
  6. public static void PrintOddEvenNumber()
  7. {
  8. var work = new TheadWorkTest();
  9. var thread1 = new Thread(work.PrintOddNumer) { Name = "奇数线程" };
  10. var thread2 = new Thread(work.PrintEvenNumber) { Name = "偶数线程" };
  11. thread1.Start();
  12. thread2.Start();
  13. }
  14. }
  15. public class TheadWorkTest
  16. {
  17. private static readonly AutoResetEvent oddAre = new AutoResetEvent(false);
  18. private static readonly AutoResetEvent evenAre = new AutoResetEvent(false);
  19. public void PrintOddNumer()
  20. {
  21. oddAre.WaitOne();
  22. for (var i = 0; i < 100; i++)
  23. {
  24. if (i % 2 != 1) continue;
  25. Console.WriteLine($"{Thread.CurrentThread.Name}:{i}");
  26. evenAre.Set();
  27. oddAre.WaitOne();
  28. }
  29. }
  30. public void PrintEvenNumber()
  31. {
  32. for (var i = 0; i < 100; i++)
  33. {
  34. if (i % 2 != 0) continue;
  35. Console.WriteLine($"{Thread.CurrentThread.Name}:{i}");
  36. oddAre.Set();
  37. evenAre.WaitOne();
  38. }
  39. }
  40. }
复制代码
View Code

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

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

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

  1. <code>通过N个线程顺序循环打印从0至100,如给定N=3则输出:
  2. <div align="center"> 114505nl2842e8azwoddia.png </div><br></code>
复制代码

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

114505pqneasij2xsxffsi.gif
114506wasew8ewveltektc.gif
  1. public class ThreadExample
  2. {
  3. /// <summary>
  4. /// N个线程顺序循环打印从0至100
  5. /// </summary>
  6. /// <param name="n"></param>
  7. public static void PrintNumber(int n = 3)
  8. {
  9. var work = new TheadWorkTest { Semaphores = new Semaphore[n] };
  10. for (var i = 0; i < n; i++)
  11. {
  12. work.Semaphores[i] = new Semaphore(1, 1);
  13. if (i != n - 1)
  14. work.Semaphores[i].WaitOne();
  15. }
  16. for (var i = 0; i < n; i++)
  17. {
  18. new Thread(work.PrintNumber) { Name = "线程" + i }.Start(i);
  19. }
  20. }
  21. }
  22. public class TheadWorkTest
  23. {
  24. public Semaphore[] Semaphores { get; set; }
  25. public static int index;
  26. public void PrintNumber(object c)
  27. {
  28. var i = Convert.ToInt32(c);
  29. var preSemaphore = i == 0 ? Semaphores[Semaphores.Length - 1] : Semaphores[i - 1];
  30. var curSemaphore = Semaphores[i];
  31. while (true)
  32. {
  33. preSemaphore.WaitOne();
  34. Interlocked.Increment(ref index);
  35. if (index > 99)
  36. return;
  37. Console.WriteLine($"{Thread.CurrentThread.Name}:{index}");
  38. curSemaphore.Release();
  39. }
  40. }
  41. }
复制代码
View Code

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

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

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

文章转载自:http://www.pythonheidong.com/blog/article/2553/


来源:https://www.cnblogs.com/xiongbatianxiaskjdskjdksjdskdtuti/p/11356741.html
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则