C#实现两个线程交替输出字母数组

最近看到华为的一道面试题,用两个线程一个输出字母一个输出数字,交替输出Chat数组,数组如下:

   char[] aI = "1234567".ToCharArray();   char[] aC = "ABCDEFG".ToCharArray();

如何实现呢?废话少说,直接上代码实现,可以使用两种方式,先来看看第一种笨办法,通过线程等待实现:.

 static void Main(string[] args) {   char[] aI = "1234567".ToCharArray();   char[] aC = "ABCDEFG".ToCharArray();   Task task1=null;   Task task2=null;   task1 = Task.Run(() =>   {     foreach (var item in aI)     {         Console.WriteLine(item);         //线程等待,这样可以交替执行,设计时间短了不行。有问题         task1.Wait(1000);       }   });   task2 = Task.Run(() =>   {     foreach (var item in aC)     {         Console.WriteLine(item);         task2.Wait(1000);     }   });   Task.WaitAll(task1);//防止跳出等待执行完成   Task.WaitAll(task2);//防止跳出等待执行完成   Console.ReadLine(); }

 方法二是使用AutoResetEvent类的WaitOne和Set,其中WaitOne是阻止当前线程,直到当前 WaitHandle 收到信号;Set是将事件状态设置为终止状态,允许一个或多个等待线程继续。控制两个线程交替组织等待,从而实现交替输出。

 private static readonly AutoResetEvent CAre = new AutoResetEvent(false); private static readonly AutoResetEvent IAre = new AutoResetEvent(false); static void Main(string[] args) {     char[] aI = "1234567".ToCharArray();     char[] aC = "ABCDEFG".ToCharArray();     Task task1=null;     Task task2=null;     task1 = Task.Run(() =>     {         CAre.WaitOne();         foreach (var item in aC)         {             Console.WriteLine(item);             IAre.Set();             CAre.WaitOne();         }     });     task2 = Task.Run(() =>     {         foreach (var item in aI)         {             Console.WriteLine(item);             CAre.Set();             IAre.WaitOne();         }     });     Task.WaitAll(task1);     Task.WaitAll(task2);     Console.ReadLine(); }

这原本是个华为JAVA的面试题,觉得有趣就用C#实现了,万一那个面试官用到这个题来考.NET技术呢?这主要是考你对多线程的熟悉程度,还有其它方法,大家可以试一试。