求100以内偶数的和c#_一道有意思的多线程面试题 C# 代码实现

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

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

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

效果图:

8270b8836a200e10daefad54d36a759f.png

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

3908946430005402991192199132cb90.png

public class ThreadExample
{/// /// 两个线程交替打印0~100的奇偶数/// 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 = 0; i < 100; i++)
{if (i % 2 != 1) continue;
Console.WriteLine($"{Thread.CurrentThread.Name}:{i}");
evenAre.Set();
oddAre.WaitOne();
}
}public void PrintEvenNumber()
{for (var i = 0; i < 100; i++)
{if (i % 2 != 0) continue;
Console.WriteLine($"{Thread.CurrentThread.Name}:{i}");
oddAre.Set();
evenAre.WaitOne();
}
}
}

View Code

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

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

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

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

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

3908946430005402991192199132cb90.png

public class ThreadExample
{/// /// N个线程顺序循环打印从0至100/// /// public static void PrintNumber(int n = 3)
{var work = new TheadWorkTest { Semaphores = new Semaphore[n] };for (var i = 0; i < n; i++)
{
work.Semaphores[i] = new Semaphore(1, 1);if (i != n - 1)
work.Semaphores[i].WaitOne();
}for (var i = 0; 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 == 0 ? Semaphores[Semaphores.Length - 1] : Semaphores[i - 1];var curSemaphore = Semaphores[i];while (true)
{
preSemaphore.WaitOne();
Interlocked.Increment(ref index);if (index > 99)return;
Console.WriteLine($"{Thread.CurrentThread.Name}:{index}");
curSemaphore.Release();
}
}
}

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/

来源:python黑洞网 www.pythonheidong.com

版权申明:本文来源于网友收集或网友提供,如果有侵权,请转告版主或者留言,本公众号立即删除。

4098e3f0e3401b07331b4b0181d36ea4.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值