1. 程式人生 > 實用技巧 >C#回答Java面試題(1):兩個執行緒交替執行。

C#回答Java面試題(1):兩個執行緒交替執行。

  這其實算是一個開放性的問題,據說在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結果也是一樣的。
 先在這裡寫兩種,以後想到或者看到有什麼有趣的寫法再更新。