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

作者:MM_MS日期:2025/11/28

方法一:

编写代码实现切换逻辑
1using System;
2using System.Threading;
3
4namespace 让两个线程交替打印偶数和奇数值_并发_
5{
6    internal class Program
7    {
8        // ===================== 共享资源与同步工具 =====================
9        // 1. 偶数线程的当前值(初始为0,每次+2,打印偶数)
10        private static int _evenNum = 0;
11        // 2. 奇数线程的当前值(初始为99,每次-2,打印奇数)
12        private static int _oddNum = 99;
13        // 3. 同步事件:控制偶数线程的执行权限
14        // 初始为“有信号”(true)→ 让偶数线程先执行(对应案例中先打印0)
15        private static AutoResetEvent _evenEvent = new AutoResetEvent(initialState: true);
16        // 4. 同步事件:控制奇数线程的执行权限
17        // 初始为“无信号”(false)→ 奇数线程等待偶数线程完成后再执行
18        private static AutoResetEvent _oddEvent = new AutoResetEvent(initialState: false);
19
20        static void Main(string[] args)
21        {
22            Console.WriteLine("线程交替打印开始:");
23            Console.WriteLine("-------------------------------------\n");
24
25            // ===================== 偶数线程(打印偶数) =====================
26            // 创建线程:负责打印偶数(0、2、4...)
27            Thread evenThread = new Thread(PrintEvenNumbers)
28            {
29                Name = "偶数线程(程A)" // 设置线程名称,便于调试/标识
30            };
31
32            // ===================== 奇数线程(打印奇数) =====================
33            // 创建线程:负责打印奇数(99、97、95...)
34            Thread oddThread = new Thread(PrintOddNumbers)
35            {
36                Name = "奇数线程(程B)" // 设置线程名称
37            };
38
39            // 启动两个线程(此时线程进入就绪状态,等待CPU调度)
40            evenThread.Start();
41            oddThread.Start();
42
43            // 主线程等待子线程执行完毕(避免主线程提前退出)
44            evenThread.Join();
45            oddThread.Join();
46
47            Console.WriteLine("\n-------------------------------------");
48            Console.WriteLine("所有数字打印完成,程序结束");
49        }
50
51
52        /// <summary>
53        /// 偶数线程的执行逻辑:打印偶数,完成后通知奇数线程
54        /// </summary>
55        private static void PrintEvenNumbers()
56        {
57            // 循环条件:偶数不超过99(与奇数范围保持一致)
58            while (_evenNum <= 99)
59            {
60                // 等待“偶数线程的执行信号”:
61                // - 初始为“有信号”,线程直接执行;
62                // - 执行后信号会自动重置为“无信号”,需等待奇数线程通知才能再次执行
63                _evenEvent.WaitOne();
64
65                // 打印当前偶数(格式与案例一致:线程名 + 数值)
66                Console.WriteLine($"{Thread.CurrentThread.Name}: {_evenNum}");
67
68                // 偶数线程的数值自增2(获取下一个偶数)
69                _evenNum += 2;
70
71                // 通知奇数线程:可以执行打印操作了
72                // 将“奇数线程的执行信号”设为“有信号”,唤醒等待中的奇数线程
73                _oddEvent.Set();
74                Thread.Sleep(500);
75            }
76        }
77
78        /// <summary>
79        /// 奇数线程的执行逻辑:打印奇数,完成后通知偶数线程
80        /// </summary>
81        private static void PrintOddNumbers()
82        {
83            // 循环条件:奇数不小于0(与偶数范围保持一致)
84            while (_oddNum >= 0)
85            {
86                // 等待“奇数线程的执行信号”:
87                // - 初始为“无信号”,线程会阻塞;
88                // - 需等待偶数线程执行完毕后,通过_oddEvent.Set()唤醒
89                _oddEvent.WaitOne();
90
91                // 打印当前奇数(格式与案例一致:线程名 + 数值)
92                Console.WriteLine($"{Thread.CurrentThread.Name}: {_oddNum}");
93
94                // 奇数线程的数值自减2(获取下一个奇数)
95                _oddNum -= 2;
96
97                // 通知偶数线程:可以执行打印操作了
98                // 将“偶数线程的执行信号”设为“有信号”,唤醒等待中的偶数线程
99                _evenEvent.Set();
100                Thread.Sleep(500);
101            }
102        }
103    }
104}
105
测试演示

方法二:

创建 Winform 项目并设计界面

编写代码实现切换逻辑
1using System;
2using System.Threading;
3using System.Windows.Forms;
4
5namespace _01_奇偶数交替打印
6{
7    public partial class Form1 : Form
8    {
9        public Form1()
10        {
11            InitializeComponent();
12        }
13
14        private void Form1_Load(object sender, EventArgs e)
15        {
16            // 窗体加载时,关闭跨线程非法调用检查机制
17            Control.CheckForIllegalCrossThreadCalls = false;
18        }
19
20        private void button1_Click(object sender, EventArgs e)
21        {
22            // 创建两个线程
23            Thread threadA = new Thread(PrintOdd);// 打印奇数
24            threadA.Name = "线程A";
25            threadA.Start(99);
26            Thread threadB = new Thread(PrintEven);// 打印偶数
27            threadB.Name = "线程B";
28            threadB.Start(100);
29        }
30
31        private void PrintOdd(object num)// 给线程当中的参数传递值,线程所绑定的方法参数类型只能是object类型
32        {
33            for (int i = (int)num; i >= 1; i-=2)
34            {
35                textBox1.AppendText(Thread.CurrentThread.Name +"--->"+ i.ToString() + "\r\n");
36                Thread.Sleep(500);
37            }
38        }
39
40        private void PrintEven(object num)
41        {
42            for (int i = 0; i <= (int)num; i+=2)
43            {
44                textBox1.AppendText(Thread.CurrentThread.Name + "--->" + i.ToString() + "\r\n");
45                Thread.Sleep(500);
46            }
47        }
48    }
49}
50
测试演示

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


C#小案例-->让两个线程交替打印偶数和奇数值(并发)》 是转载文章,点击查看原文


相关推荐


手写 EventEmitter:深入理解发布订阅模式
1024肥宅2025/12/7

引言 在 JavaScript 开发中,事件驱动编程是构建可维护、可扩展应用的核心范式之一。从浏览器 DOM 事件到 Node.js 的异步 I/O,从 Vue 的组件通信到 React 的状态管理,发布订阅模式无处不在。 通过手写一个符合 Node.js EventEmitter 标准的实现,我们不仅能深入理解事件驱动架构的设计原理,还能掌握 JavaScript 中闭包、内存管理、设计模式等核心概念。更重要的是,这是面试中常见的高级题目,能体现你对JavaScript设计模式的理解深度。 本


【鸿蒙开发案例篇】鸿蒙6.0的pdfService与pdfViewManager终极爆破
威哥爱编程2025/12/15

大家好,我是V哥。 兄弟们抄家伙!今天给大家分享用鸿蒙6.0的PDF Kit撕碎文档开发防线,全程高能代码扫射,专治各种PDF开发不服!以下基于HarmonyOS 6.0(API 21)的ArkTS实战,弹药已上膛👇 联系V哥获取 鸿蒙学习资料 💣 第一弹:pdfService——文档底层爆破术 核心能力:文档加载/编辑/转换 import { pdfService } from '@kit.PDFKit'; import { BusinessError } from '@kit.Ba


智谱年末王炸:GLM-4.7开源,这可能是给程序员最好的圣诞礼物
墨风如雪2025/12/23

2025年的年底,本以为AI圈的大战会随着节日季的到来暂时偃旗息鼓,没想到智谱AI在这个节点扔下了一枚重磅炸弹。 就在12月23日,他们正式发布并开源了GLM-4.7。这不仅仅是一次常规的版本号迭代,更像是一次针对开发者痛点的精准爆破。如果你还在为开源模型写不出能跑的代码而头疼,或者还在心疼闭源API高昂的账单,那么GLM-4.7可能正是你在等的那个破局者。 这不是参数堆砌,是实打实的“智力”升级 先说最直观的感受。过去我们用开源模型写代码,往往是“一看顿悟,一跑报错”。但这次GLM-4.7在


权限与访问控制
weixin79893765432...2026/1/2

目录 一、概念二、权限与访问控制的「能力全景图」三、前端视角的「权限控制分层模型」(核心)1、登录态层(Authentication State)2、路由层(Page Access Control)3、菜单层(Navigation Control)4、组件 / 操作层(Action Control) 四、前端权限系统的“典型数据流”五、权限模型的三种常见设计(前端必须懂)1、RBAC(基于角色)2、PBAC(基于权限点)3、ABAC(基于属性/规则) 六、重点「权限与访问控制」业务剖析


后端线上发布计划模板
uzong2026/1/10

敬畏每一行代码,敬畏每一次变更。 本模板旨在通过结构化、可验证、可回溯的方式,降低发布风险,保障系统稳定。 一、📅 发布基本信息 项目内容发布名称示例:用户中心 v2.3.0 上线发布时间2026-01-15 01:00 – 02:30发布负责人xxx协同人员xxx发布类型✅ 功能上线 / 🔁 配置变更 / 🐞 紧急修复 / ⚙️ 架构调整是否灰度发布是 / 否(若“是”,说明策略:如 5% → 20% → 100%) 二、


2026前端面试题及答案
阿芯爱编程2026/1/18

2026前端面试题及答案 HTML/CSS 部分 1. 什么是盒模型?标准盒模型和IE盒模型的区别是什么? 答案: 盒模型是CSS中用于布局的基本概念,每个元素都被表示为一个矩形盒子,由内容(content)、内边距(padding)、边框(border)和外边距(margin)组成。 区别: 标准盒模型(W3C盒子模型):width和height只包含内容(content) IE盒模型(怪异模式盒子模型):width和height包含内容(content)、内边距(padding)和边框(b

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客