??这其实算是一个开放性的问题,据说在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结果也是一样的。
先在这里写两种,以后想到或者看到有什么有趣的写法再更新。
原文:https://www.cnblogs.com/medicinezhong/p/14225689.html