方法一:
编写代码实现切换逻辑
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);
}
}
}
}
测试演示

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



被折叠的 条评论
为什么被折叠?



