首页 > 其他分享 >2、多线程-三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的字符串

2、多线程-三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的字符串

时间:2024-12-14 11:45:46浏览次数:4  
标签:int 打印 printChar AutoResetEvent 线程 多线程 public

题目

三个线程分别打印 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();
	}
}

标签:int,打印,printChar,AutoResetEvent,线程,多线程,public
From: https://www.cnblogs.com/chenshibao/p/18606137

相关文章

  • 1、多线程-打印零与奇偶数
    题目:classZeroEvenOdd{publicZeroEvenOdd(intn){...}//构造函数publicvoidzero(printNumber){...}//仅打印出0publicvoideven(printNumber){...}//仅打印出偶数publicvoidodd(printNumber){...}//仅打印出奇数}相同的一个ZeroE......
  • 6、多线程 - 用两个线程,一个输出字母,一个输出数字,交替输出 1A2B3C4D...26Z
    题目用两个线程,一个输出字母,一个输出数字,交替输出1A2B3C4D...26Z代码示例usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;publicclassNumberLetterPrinter{ privateAutoResetEventnumberEvent=newAutoResetEvent(true);//一开始数字线程可......
  • 一对一视频源码,如何实现并发可重试的线程池?
    一对一视频源码,优雅的实现循环重试在一对一视频源码开发工作中,重处理是一个非常常见的场景,比如:发送消息失败。调用远程服务失败。争抢锁失败。这些错误可能是因为网络波动造成的,等待过后重处理就能成功。通常来说,会用try/catch,while循环之类的语法来进行重处理,但是这样的做法缺......
  • 【Linux】:多线程(POSIX 信号量 、基于环形队列的生产消费者模型)
    ......
  • [Java]多线程
    线程:线程就是程序内部的一条流水线分类单线程:同一时间内,程序只能有一条执行流程多线程:同一时间内,程序可以控制多条执行流程创建线程java是通过java,lang.Thread类的对象来代表线程的继承Thread类步骤定义一个子类(MyThread)继承Thread类,重写run()方法,在......
  • 线程池 坑中之王 !
    前言线程池是Java中处理多线程的强大工具,但它不仅仅是“直接用就完事”的工具。很多小伙伴在用线程池时,因为配置不当或忽略细节,踩过许多坑。今天跟大家一起聊聊线程池中容易踩的10个坑,以及如何避免这些坑,希望对你会有所帮助。1.直接使用Executors创建线程池许多初学者......
  • GPU加速主要通过并行化计算任务,适合大规模数据处理和计算密集型应用。 多线程并发适用
    GPU加速和多线程并发是提高计算密集型任务性能的两种重要技术。它们在不同领域(如深度学习、科学计算、图像处理等)得到了广泛应用。下面,我将详细介绍这两者的概念、原理、以及如何结合它们进行高效计算。1. GPU加速1.1 GPU加速的基本原理GPU(图形处理单元)最初设计用于图像和视......
  • JavaEE初阶——多线程4(线程安全 和 解决办法(synchronized))
    线程不安全原因小结:1.【根本原因】操作系统上的线程是“抢占式执行”“随机调度”=>线程之间执行顺序有很多变数(罪魁祸首,万恶之源)2.代码结构:代码中,多个线程,同时,修改,同一个变量。、如果只是读取,变量的内容是固定不变的。如果是两个不同变量,彼此之间就不会产生相互覆盖......
  • DLL调试,通过加载exe线程
    1、双击运行已经编译好的exe程序2、‌设置DLL工程为启动工程‌:将DLL工程设置为启动工程,这样调试器才能挂接到DLL工程上。‌‌配置调试属性‌:右键单击DLL工程,选择“属性”进入属性设置页面。在“配置属性”中选择“调试”,然后在“要启动的调试器”列表中选择“本地Windows调......
  • redis数据结构和内部编码及单线程架构
     博主主页: 码农派大星.  数据结构专栏:Java数据结构 数据库专栏:数据库JavaEE专栏:JavaEE软件测试专栏:软件测试关注博主带你了解更多知识1.数据结构和内部编码 Redis会在合适的场景选择合适的内部编码 我们可以通过objectencoding命令查询内部编码 :......