C#小案例-->让两个线程交替打印偶数和奇数值(并发)

C#实现两个线程交替打印1-100 使用C#实现,两个线程交替打印输出数字1-100,一个线程只打印偶数,另一个只打印奇数,并且要求按顺序输出。 阅读详情

方法一:

编写代码实现切换逻辑
using System;
using System.Threading;

namespace 让两个线程交替打印偶数和奇数值_并发_
{
    internal class Program
    {
        // ===================== 共享资源与同步工具 =====================
        // 1. 偶数线程的当前值(初始为0,每次+2,打印偶数)
        private static int _evenNum = 0;
        // 2. 奇数线程的当前值(初始为99,每次-2,打印奇数)
        private static int _oddNum = 99;
        // 3. 同步事件:控制偶数线程的执行权限
        // 初始为“有信号”(true)→ 让偶数线程先执行(对应案例中先打印0)
        private static AutoResetEvent _evenEvent = new AutoResetEvent(initialState: true);
        // 4. 同步事件:控制奇数线程的执行权限
        // 初始为“无信号”(false)→ 奇数线程等待偶数线程完成后再执行
        private static AutoResetEvent _oddEvent = new AutoResetEvent(initialState: false);

        static void Main(string[] args)
        {
            Console.WriteLine("线程交替打印开始:");
            Console.WriteLine("-------------------------------------\n");

            // ===================== 偶数线程(打印偶数) =====================
            // 创建线程:负责打印偶数(0、2、4...)
            Thread evenThread = new Thread(PrintEvenNumbers)
            {
                Name = "偶数线程(程A)" // 设置线程名称,便于调试/标识
            };

            // ===================== 奇数线程(打印奇数) =====================
            // 创建线程:负责打印奇数(99、97、95...)
            Thread oddThread = new Thread(PrintOddNumbers)
            {
                Name = "奇数线程(程B)" // 设置线程名称
            };

            // 启动两个线程(此时线程进入就绪状态,等待CPU调度)
            evenThread.Start();
            oddThread.Start();

            // 主线程等待子线程执行完毕(避免主线程提前退出)
            evenThread.Join();
            oddThread.Join();

            Console.WriteLine("\n-------------------------------------");
            Console.WriteLine("所有数字打印完成,程序结束");
        }


        /// <summary>
        /// 偶数线程的执行逻辑:打印偶数,完成后通知奇数线程
        /// </summary>
        private static void PrintEvenNumbers()
        {
            // 循环条件:偶数不超过99(与奇数范围保持一致)
            while (_evenNum <= 99)
            {
                // 等待“偶数线程的执行信号”:
                // - 初始为“有信号”,线程直接执行;
                // - 执行后信号会自动重置为“无信号”,需等待奇数线程通知才能再次执行
                _evenEvent.WaitOne();

                // 打印当前偶数(格式与案例一致:线程名 + 数值)
                Console.WriteLine($"{Thread.CurrentThread.Name}: {_evenNum}");

                // 偶数线程的数值自增2(获取下一个偶数)
                _evenNum += 2;

                // 通知奇数线程:可以执行打印操作了
                // 将“奇数线程的执行信号”设为“有信号”,唤醒等待中的奇数线程
                _oddEvent.Set();
                Thread.Sleep(500);
            }
        }

        /// <summary>
        /// 奇数线程的执行逻辑:打印奇数,完成后通知偶数线程
        /// </summary>
        private static void PrintOddNumbers()
        {
            // 循环条件:奇数不小于0(与偶数范围保持一致)
            while (_oddNum >= 0)
            {
                // 等待“奇数线程的执行信号”:
                // - 初始为“无信号”,线程会阻塞;
                // - 需等待偶数线程执行完毕后,通过_oddEvent.Set()唤醒
                _oddEvent.WaitOne();

                // 打印当前奇数(格式与案例一致:线程名 + 数值)
                Console.WriteLine($"{Thread.CurrentThread.Name}: {_oddNum}");

                // 奇数线程的数值自减2(获取下一个奇数)
                _oddNum -= 2;

                // 通知偶数线程:可以执行打印操作了
                // 将“偶数线程的执行信号”设为“有信号”,唤醒等待中的偶数线程
                _evenEvent.Set();
                Thread.Sleep(500);
            }
        }
    }
}
测试演示

方法二:

创建 Winform 项目并设计界面

编写代码实现切换逻辑
using System;
using System.Threading;
using System.Windows.Forms;

namespace _01_奇偶数交替打印
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // 窗体加载时,关闭跨线程非法调用检查机制
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 创建两个线程
            Thread threadA = new Thread(PrintOdd);// 打印奇数
            threadA.Name = "线程A";
            threadA.Start(99);
            Thread threadB = new Thread(PrintEven);// 打印偶数
            threadB.Name = "线程B";
            threadB.Start(100);
        }

        private void PrintOdd(object num)// 给线程当中的参数传递值,线程所绑定的方法参数类型只能是object类型
        {
            for (int i = (int)num; i >= 1; i-=2)
            {
                textBox1.AppendText(Thread.CurrentThread.Name +"--->"+ i.ToString() + "\r\n");
                Thread.Sleep(500);
            }
        }

        private void PrintEven(object num)
        {
            for (int i = 0; i <= (int)num; i+=2)
            {
                textBox1.AppendText(Thread.CurrentThread.Name + "--->" + i.ToString() + "\r\n");
                Thread.Sleep(500);
            }
        }
    }
}
测试演示

希望对大家有所帮助。感谢大家的关注和点赞。

C# 多线程互斥 两个线程交替工作 C# 多线程互斥 两个线程交替工作 C#多线程互斥,两个线程交替工作,如上图所示,挺有意思的。 立即下载

相关推荐

两个线程交替执行

一个线程打印123,另一个打印456,最终结果是打印123 456 123 45

C# 多线程交替按照指定顺序执行

1.关于AutoResetEvent和ManualResetEvent的区别 2.多线程按照指定顺序执行

m0_47020592的博客 1289

C#多线程互斥,两个线程交替工作

内容索引:C#源码,系统相关,多线程  C#多线程互斥,两个线程交替工作,如上图所示,挺有意思的。

C# 输入一个正整数N,判断N是奇数还是偶数,输出1~N的奇数和或是偶数和,三种不同方法分别实现

using System; namespace _2_2 { class Program { static void Main(string[] args) { Console.WriteLine("请输入一个正整数N"); string str = Console.ReadLine(); int number =int.Parse(str); bool isOdd = false; .

ZJL_Hi的博客 7784

飞凌OK3588-C Linux R4系统下MIPI YUV摄像头CSI尺寸错误排查与极性适配方案

本文详细介绍了在飞凌OK3588-C平台的Linux R4系统下调试MIPI YUV摄像头时遇到的'csi size err'错误排查与极性适配方案。通过分析信号极性、驱动参数调整及FPGA协同调试,提供了从硬件检测到系统级调试的完整解决方案,帮助开发者快速解决类似问题。

bean的博客 259

Xilinx PL实现DP TX视频传输的关键配置与实战解析

本文详细解析了在Xilinx ZCU106开发板上,利用PL(可编程逻辑)实现DP TX(DisplayPort发送)视频传输的关键配置与实战流程。内容涵盖从硬件平台搭建、DP TX IP核参数(如链路速率、通道数、视频时序)的详细配置,到软件驱动初始化、中断处理及链路训练的全过程,并提供了屏幕闪烁、颜色异常等常见问题的避坑指南与调试技巧,旨在帮助开发者高效实现稳定的4K视频输出。

weixin_29165465的博客 352

两个线程交替打印0~100的奇偶数

用synchronized关键字实现 public class TestMain { //定义一个int变量 private static volatile int number = 0; //定义一个对象锁 private static final Object lock = new Object(); public static void ma...

硅脂味咖啡的博客 844

Applied Energy期刊小白论文投稿模板-流程经验分享

Applied Energy期刊小白论文投稿模板-流程经验分享,Elsevier期刊(爱思唯尔)投稿流程

zzu_Flyer的博客 4万+

C# 奇偶数

输入一个整数,判断奇偶数 Console.Write("请输入一个整数:"); int z = int.Parse(Console.ReadLine());//读取输入的整数,并赋值给z if (z % 2 == 0)//通过取余数判断是否为奇偶数 Console.WriteLine("{0}是偶数", z); else Console.WriteLine(

松子喵喵 5727

本地大模型部署实战:LM Studio与Ollama的易用性与性能深度评测

本文对两款主流本地大模型部署工具LM Studio和Ollama进行了深度评测。LM Studio凭借图形化界面和内置模型库,为新手提供了开箱即用的便捷体验,并支持OpenAI兼容API,易于生态集成。Ollama则以命令行驱动,轻量高效,凭借其原生API和Modelfile自定义能力,在自动化集成和性能方面表现突出。文章从易用性、模型生态、性能及扩展性多维度对比,帮助用户根据自身技术背景和使用场景做出最佳选择。

weixin_29039773的博客 528

保姆级教程:用GD32F470的EXMC Bank0 Region0与FPGA实现16位并行通信(附完整代码)

本文详细介绍了如何利用GD32F470的EXMC Bank0 Region0与FPGA实现16位并行通信,涵盖硬件连接、寄存器配置、时序优化及FPGA接口设计等关键步骤。通过实例代码和调试技巧,帮助开发者快速掌握高效数据交互技术,提升嵌入式系统设计能力。

weixin_26918763的博客 226

经典面试题——两个线程交替打印奇数和偶数

前提 今天下班时候和同事聊天偶然听到面试题“两个线程交替打印奇数和偶数”的实现,这里做一个复盘。 复盘 场景一:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用对象监视器实现。 场景二:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用JDK提供的并发类库实现。 这两个场景中,场景一是一种比较古老的同步方式,本质由JVM实现;场景二是JDK1.5引入...

weixin_30470857的博客 344

关于LIO-SAM编译时出现错误 /usr/bin/ld: 找不到 -lBoost::timer

关于LIO-SAM编译时出现错误: 下载LIO-SAM代码 进入LIO-SAM文件夹,通过以下代码编译: mkdir build cd build cmake .. make 报错: /usr/bin/ld: 找不到 -lBoost::timer collect2: error: ld returned 1 exit status CMakeFiles/lio_sam_imuPreintegration.dir/build.make:759: recipe for target 'devel/lib/li

wwtx的博客 3648

两个线程交替打印奇偶数

问题描述 两个线程交替打印0到100: 偶数线程:0 基数线程:1 偶数线程:2 基数线程:3 偶数线程:4 基数线程:5 偶数线程:6 基数线程:7 ...... ...... 简单实现 package test; public class OdevityThread { static class Soulution implements Runnable { private stat...

起名字真伤脑筋 535

[HBM] RAM Cell Self Repair | 内存单元自我修复

对抗错误的大都是冗余,内存颗粒在设计的时候也考虑增加冗余。具体的说:添加冗余或备用的存储单元行和列,及时将测试中的故障进行修复和替换,存储器修复包括行修复,列修复或两者的组合。

串起点滴 785

SPI 总线信号完整性与时序一致性测试

SPI总线测试的核心目标是验证其电气与时序行为是否满足芯片规格要求,确保通信可靠性

硬核科技 330

两个线程交替打印奇、偶数

public class PrintOddEven { private static int count = 0; private static final Object lock = new Object(); static class TurningRunner implements Runnable { @Override publi...

u014508885的博客 258

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

两个线程交替打印奇偶数【Lock版】

import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Solution { private int start = 1; /** * 对flag的写入虽然加锁保证了线程安全,但由于读取时不是...

weixin_30817749的博客 159

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

两个线程交替打印奇数和偶数

public class ThreadTest { public static void main(String[] args) { Thread evenThread = new Thread(new PrintEven(),"打印奇数"); Thread oddThread = new Thread(new PrintOdd(),"打...

WUTAO2213的博客 403

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

面试题-使用线程交替打印奇数偶数

这世上有三样东西是别人抢不走的:一是吃进胃里的食物,二是藏在心中的梦想,三是读进大脑的书 分析题目。需要使用两个线程交替打印奇偶数。 使用同步锁解决这个问题 使用信号量来实现交替打印 定义两个信号量,一个奇数信号量,一个偶数信号量,都初始化为1 先用掉偶数的信号量,因为要让奇数先启动,等奇数打印完再释放 信号量实现 具体实现思路: 定义两个信号量,一个奇数信号量,一个偶数信号量...

weixin_33873846的博客 193

两个线程交替打印1-100奇偶数

看代码,如有问题,请大家指正! package Test; public class PrintOddAndEven { private static int num=1; public synchronized void print() { while(num<=100){ if(num%2!=0) ...

NWPU_LIUBO的博客 245

面试常考:C#用两个线程交替打印1-100的五种方法

其中一个线程负责打印奇数,另一个线程负责打印偶数。线程在执行任务之前会锁定共享的Mutex或lock对象,以确保每个线程执行任务时只有一个线程能够访问共享资源。4、异步编程:异步编程是指不阻塞线程并且在完成任务后通知线程的编程模型,它可以提高应用程序的响应能力和性能。1、C#编程语言和语法:实现多线程程序需要熟悉C#编程语言和语法,包括线程的创建和管理、共享资源的访问和同步等方面的知识。3、线程同步机制:线程同步机制是指用于控制多个线程访问共享资源的机制,常用的线程同步机制包括锁、信号量、事件等。

软件开发学习交流 1141

两个多线程的交替打印

package cn.thread; public class ManyThread { public static void main(String[] args) { Object obj = new Object(); new Thread(new MyHandler1(obj), "t1").start(); ...

A458545418的博客 207

实现两个线程相互交替 打印奇数偶数 ,为了避免忘记记录下来

import os import re import time import threading # start_time=time.time() # with open('1.txt','r',errors='ignore') as F: # A=F.read() # # # patternn_sku1=r'="((https|http)://(?!item).+?!!.+?\.jpg...

KAIFADOUSHIFEIFA的博客 258
上一篇: C# 线程与并发编程完全指南:从基础到高级带详细注释版(一篇读懂)
下一篇: WinForm+C#小案例--->年会抽奖人名小程序
MM_MS
博客等级 码龄1年 58粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MM_MS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值