方法一:
编写代码实现切换逻辑
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#小案例-->让两个线程交替打印偶数和奇数值(并发)》 是转载文章,点击查看原文。