首页 > 其他分享 >1、多线程-打印零与奇偶数

1、多线程-打印零与奇偶数

时间:2024-12-14 11:45:24浏览次数:6  
标签:奇偶 int printNumber ZeroEvenOdd 打印 线程 void 多线程 public

题目:

class ZeroEvenOdd {
public ZeroEvenOdd(int n) { ... } // 构造函数
public void zero(printNumber) { ... } // 仅打印出 0
public void even(printNumber) { ... } // 仅打印出 偶数
public void odd(printNumber) { ... } // 仅打印出 奇数
}
相同的一个 ZeroEvenOdd 类实例将会传递给三个不同的线程:

线程 A 将调用 zero(),它只输出 0 。
线程 B 将调用 even(),它只输出偶数。
线程 C 将调用 odd(),它只输出奇数。
每个线程都有一个 printNumber 方法来输出一个整数。请修改给出的代码以输出整数序列 010203040506... ,其中序列的长度必须为 2n。

示例 1:

输入:n = 2
输出:"0102"
说明:三条线程异步执行,其中一个调用 zero(),另一个线程调用 even(),最后一个线程调用odd()。正确的输出为 "0102"。
示例 2:

输入:n = 5
输出:"0102030405"

C#代码示例

public class Program
{
	static void Main(string[] args)
	{

		int n = 5;
		ZeroEvenOdd zeroEvenOdd = new ZeroEvenOdd(n);
		var zeroTask = Task.Run(() => zeroEvenOdd.Zero(Console.Write));
		var evenTask = Task.Run(() => zeroEvenOdd.Even(Console.Write));
		var oddTask = Task.Run(() => zeroEvenOdd.Odd(Console.Write));

		Task.WaitAll(zeroTask,evenTask,oddTask);

		Console.ReadKey();
	}

}

 public class ZeroEvenOdd
 {
	 private int n;
	 private int currentNumber = 1;

	 private AutoResetEvent zeroEvent = new AutoResetEvent(true); //开始:zero 可以运行
	 private AutoResetEvent evenEvent = new AutoResetEvent(false);
	 private AutoResetEvent oddEvent = new AutoResetEvent(false);

	 public ZeroEvenOdd(int n)       
	 { 
		 this.n = n;
	 }

	 public void Zero(Action<int> printNumber)
	 {
		 for (int i = 0; i < n; i++) 
		 { 
			 zeroEvent.WaitOne(); //等待zero事件
			 printNumber(0); //打印 0

			 if ( currentNumber % 2 == 0)
			 {
				 evenEvent.Set(); // 如果 currentNumber 是偶数 ,唤醒 even线程
			 }
			 else
			 {
				 oddEvent.Set(); // 如果 currentNumber 是奇数,唤醒 odd线程
			 }

			 Interlocked.Increment(ref currentNumber); // 增加 currentNumber
		 }
	 }


	 public void Even(Action<int> printNumber)
	 {
		 for (int i =2; i<= n; i+= 2)
		 {
			 evenEvent.WaitOne(); //等待 even 事件
			 printNumber(i);     //打印偶数
			 zeroEvent.Set();    // 唤醒 zero线程
		 }
	 }


	 public void Odd(Action<int> printNumber)
	 {
		 for (int i = 1; i <= n; i += 2)
		 {
			 oddEvent.WaitOne(); //等待 odd 事件
			 printNumber(i);     //打印奇数
			 zeroEvent.Set();    // 唤醒 zero线程
		 }
	 }


 }

标签:奇偶,int,printNumber,ZeroEvenOdd,打印,线程,void,多线程,public
From: https://www.cnblogs.com/chenshibao/p/18606133

相关文章

  • 6、多线程 - 用两个线程,一个输出字母,一个输出数字,交替输出 1A2B3C4D...26Z
    题目用两个线程,一个输出字母,一个输出数字,交替输出1A2B3C4D...26Z代码示例usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;publicclassNumberLetterPrinter{ privateAutoResetEventnumberEvent=newAutoResetEvent(true);//一开始数字线程可......
  • 【Linux】:多线程(POSIX 信号量 、基于环形队列的生产消费者模型)
    ......
  • [Java]多线程
    线程:线程就是程序内部的一条流水线分类单线程:同一时间内,程序只能有一条执行流程多线程:同一时间内,程序可以控制多条执行流程创建线程java是通过java,lang.Thread类的对象来代表线程的继承Thread类步骤定义一个子类(MyThread)继承Thread类,重写run()方法,在......
  • GPU加速主要通过并行化计算任务,适合大规模数据处理和计算密集型应用。 多线程并发适用
    GPU加速和多线程并发是提高计算密集型任务性能的两种重要技术。它们在不同领域(如深度学习、科学计算、图像处理等)得到了广泛应用。下面,我将详细介绍这两者的概念、原理、以及如何结合它们进行高效计算。1. GPU加速1.1 GPU加速的基本原理GPU(图形处理单元)最初设计用于图像和视......
  • JavaEE初阶——多线程4(线程安全 和 解决办法(synchronized))
    线程不安全原因小结:1.【根本原因】操作系统上的线程是“抢占式执行”“随机调度”=>线程之间执行顺序有很多变数(罪魁祸首,万恶之源)2.代码结构:代码中,多个线程,同时,修改,同一个变量。、如果只是读取,变量的内容是固定不变的。如果是两个不同变量,彼此之间就不会产生相互覆盖......
  • 【 C语言练习(7)—递归法反向打印字符串】
    C语言练习(7)文章目录C语言练习(7)前言问题问题分析结果总结前言进一步练习和巩固递归函数构建思想问题使用递归的方法给定一个字符串abcde,反向输出edcba问题分析对于字符串的输入和输出使用getchar()和putchar(),如下面程序所示;首先要写递归函数,递归函数原理......
  • Java转C之并发和多线程
    提纲:概念介绍与对比概述简述Java与C在并发和多线程方面的核心区别解释C11标准、POSIX、C11<threads.h>、Pthread等名词Java多线程与并发回顾线程、Runnable、ExecutorService概念说明同步关键字与工具类含义C并发基础没有Java式的内置线程类,需要外部库或标......
  • HarmonyOS:多线程并发-Worker
    Worker主要作用是为应用程序提供一个多线程的运行环境,可满足应用程序在执行过程中与宿主线程分离,在后台线程中运行一个脚本进行耗时操作,极大避免类似于计算密集型或高延迟的任务阻塞宿主线程的运行。具体接口信息及使用方法详情请见Worker。一、Worker运作机制Worker运......
  • 查看spring IoC的Bean并打印
    在Spring容器中,Bean是指注册到容器中的组件。如果想要查看并打印这些组件,可以通过以下代码进行实现:写入  ConfigurableApplicationContext.getBeanDefinitionNames()启动spring程序并获取应用上下文定义的所有Bean名称。ConfigurableApplicationContextapplicationCon......
  • 第二章 2.4使用序贯方法构建神经网络nn.Sequential() 及打印神经网络模型摘要
     #https://github.com/PacktPublishing/Modern-Computer-Vision-with-PyTorch#https://github.com/PacktPublishing/Modern-Computer-Vision-with-PyTorch###################ChapterTwo#######################################importtorchimporttorch.nnas......