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


相关推荐


首页编辑器站点地图

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

Copyright © 2025 XYZ博客

Powered by 聚合阅读