C#回答Java面試題(1):兩個執行緒交替執行。
阿新 • • 發佈:2021-01-10
這其實算是一個開放性的問題,據說在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結果也是一樣的。
先在這裡寫兩種,以後想到或者看到有什麼有趣的寫法再更新。