首页 > 编程语言 > 详细

C#回答Java面试题(1):两个线程交替执行。

时间:2021-01-10 22:54:51      阅读:52      评论:0      收藏:0      [点我收藏+]

??这其实算是一个开放性的问题,据说在Java中大概能有上百种不同的写法。虽然这个号称上百种写法给人感觉有点类似茴字有几种写法一样,但有些写法还是很有意思的,可以算是开阔下思路或者见识。

 C#中用AutoResetEvent来实现是应该比较直接和常见的方法。

    class Program
    {
        static void Main(string[] args)
        {
            char[] ch1 = "12345".ToCharArray();
            char[] ch2 = "ABCDE".ToCharArray();

            AutoResetEvent r1 = new AutoResetEvent(true);
            AutoResetEvent r2 = new AutoResetEvent(true);

            Thread t1 = new Thread(() =>
            { 
                foreach(var c in ch1)
                {
                    Console.Write(c);
                    r2.Set();
                    r1.WaitOne();
                }
            });

            Thread t2 = new Thread(() =>
            {
                foreach (var c in ch2)
                {
                    r2.WaitOne();
                    Console.Write(c);
                    r1.Set();
                }
            });

            t2.Start();
            t1.Start();

            Console.Read();
        }
    }

 另外个人感觉比较有趣的实现是使用BlockingCollection。代码上和AutoResetEvent基本没区别,只是用BlockingCollection替换了AutoResetEvent。  

    class Program
    {
        static void Main(string[] args)
        {
            char[] ch1 = "12345".ToCharArray();
            char[] ch2 = "ABCDE".ToCharArray();

            BlockingCollection<int> b1 = new BlockingCollection<int>(1);
            BlockingCollection<int> b2 = new BlockingCollection<int>(1);

            Thread t1 = new Thread(() =>
            { 
                foreach(var c in ch1)
                {
                    Console.Write(c);
                    b2.Add(1);
                    b1.Take();
                }
            });

            Thread t2 = new Thread(() =>
            {
                foreach (var c in ch2)
                {
                    b2.Take();
                    Console.Write(c);
                    b1.Add(1);
                }
            });

            t2.Start();
            t1.Start();

            Console.Read();
        }
    }

 把Thread换成Task结果也是一样的。
 先在这里写两种,以后想到或者看到有什么有趣的写法再更新。

C#回答Java面试题(1):两个线程交替执行。

原文:https://www.cnblogs.com/medicinezhong/p/14225689.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!