首页 > 其他分享 >4、多线程-通过 N 个线程顺序循环打印从 0 至 100

4、多线程-通过 N 个线程顺序循环打印从 0 至 100

时间:2024-12-14 11:46:27浏览次数:5  
标签:Console AutoResetEvent System private int 线程 100 多线程

题目

通过 N 个线程顺序循环打印从 0 至 100

代码示例

using System;
using System.Threading;
using System.Threading.Tasks;

public class ZeroEvenOdd
{
	private int n = 100;
	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 (i % 2 == 0)
			{
				evenEvent.Set(); // 如果 i 是偶数,唤醒 even 线程
			}
			else
			{
				oddEvent.Set(); // 如果 i 是奇数,唤醒 odd 线程
			}
		}
	}

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

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

	public static void Main(string[] args)
	{
		int n = 100;
		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.WriteLine();
	}
}

标签:Console,AutoResetEvent,System,private,int,线程,100,多线程
From: https://www.cnblogs.com/chenshibao/p/18606174

相关文章

  • 3、多线程-两个线程交替打印 0~100 的奇偶数
    题目两个线程交替打印0~100的奇偶数代码示例usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;publicclassZeroEvenOdd{ privateintn=100; privateAutoResetEventevenEvent=newAutoResetEvent(false); privateAutoResetEventoddEvent......
  • 2、多线程-三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC
    题目三个线程分别打印A,B,C,要求这三个线程一起运行,打印n次,输出形如“ABCABCABC....”的字符串代码示例publicclassZeroEvenOdd{ privateintn; privateAutoResetEventaEvent=newAutoResetEvent(true);//一开始A可以运行 privateAutoResetEventbEvent=new......
  • 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 信号量 、基于环形队列的生产消费者模型)
    ......
  • 写一个布局,它的宽度是不固定的100%,如何让它的宽度始终是高度的一半呢?
    要实现一个宽度为高度一半的布局,并且宽度还要是100%不固定,你可以使用CSS中的aspect-ratio属性。这个属性允许你指定一个元素的宽高比。以下是一个简单的示例:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width......
  • [Java]多线程
    线程:线程就是程序内部的一条流水线分类单线程:同一时间内,程序只能有一条执行流程多线程:同一时间内,程序可以控制多条执行流程创建线程java是通过java,lang.Thread类的对象来代表线程的继承Thread类步骤定义一个子类(MyThread)继承Thread类,重写run()方法,在......
  • 线程池 坑中之王 !
    前言线程池是Java中处理多线程的强大工具,但它不仅仅是“直接用就完事”的工具。很多小伙伴在用线程池时,因为配置不当或忽略细节,踩过许多坑。今天跟大家一起聊聊线程池中容易踩的10个坑,以及如何避免这些坑,希望对你会有所帮助。1.直接使用Executors创建线程池许多初学者......
  • #. 判断元素是否存在传统题1000ms256MiB
    题目描述有一个集合M是这样生成的:(1)已知k是集合M的元素;(2)如果y是M的元素,那么,2y+1和3y+1都是M的元素;(3)除了上述二种情况外,没有别的数能够成为M的一个元素。问题:任意给定kk和xx,请判断xx是否是MM的元素。这里的kk是无符号整数,xx 不大于 100000100000,如果是,则输出YES,否......