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();
	}
}
posted @ 2024-12-14 11:32  似梦亦非梦  阅读(16)  评论(0编辑  收藏  举报