2、多线程-三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的字符串
题目
三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的字符串
代码示例
public class ZeroEvenOdd
{
private int n;
private AutoResetEvent aEvent = new AutoResetEvent(true); // 一开始 A 可以运行
private AutoResetEvent bEvent = new AutoResetEvent(false);
private AutoResetEvent cEvent = new AutoResetEvent(false);
public ZeroEvenOdd(int n)
{
this.n = n;
}
public void PrintA(Action printChar)
{
for (int i = 0; i < n; i++)
{
aEvent.WaitOne(); // 等待 A 事件
printChar(); // 打印 A
bEvent.Set(); // 唤醒 B 线程
}
}
public void PrintB(Action printChar)
{
for (int i = 0; i < n; i++)
{
bEvent.WaitOne(); // 等待 B 事件
printChar(); // 打印 B
cEvent.Set(); // 唤醒 C 线程
}
}
public void PrintC(Action printChar)
{
for (int i = 0; i < n; i++)
{
cEvent.WaitOne(); // 等待 C 事件
printChar(); // 打印 C
aEvent.Set(); // 唤醒 A 线程
}
}
public static void Main(string[] args)
{
int n = 5;
ZeroEvenOdd zeroEvenOdd = new ZeroEvenOdd(n);
var aTask = Task.Run(() => zeroEvenOdd.PrintA(() => Console.Write("A")));
var bTask = Task.Run(() => zeroEvenOdd.PrintB(() => Console.Write("B")));
var cTask = Task.Run(() => zeroEvenOdd.PrintC(() => Console.Write("C")));
Task.WaitAll(aTask, bTask, cTask);
Console.WriteLine();
}
}