using System; using System.Threading; class PrintThread { private int id; private int totalThreads; private int startNum; private int endNum; private ManualResetEvent waitEvent; public PrintThread(int id, int totalThreads, int startNum, int endNum, ManualResetEvent waitEvent) { this.id = id; this.totalThreads = totalThreads; this.startNum = startNum; this.endNum = endNum; this.waitEvent = waitEvent; } public void Run() { for (int i = startNum; i <= endNum; i += totalThreads) { Console.WriteLine("Thread {0}: {1}", id, i); Thread.Sleep(100); } waitEvent.Set(); // 通知主线程该线程已完成打印任务 } } class Program { static void Main(string[] args) { int n = 3; // N 个线程 int totalNums = 101; // 打印从 0 至 100 ManualResetEvent[] events = new ManualResetEvent[n]; for (int i = 0; i < n; i++) { events[i] = new ManualResetEvent(false); PrintThread thread = new PrintThread(i, n, i, totalNums - 1, events[i]); Thread t = new Thread(thread.Run); t.Start(); } // 等待所有线程完成打印任务 WaitHandle.WaitAll(events); Console.WriteLine("All threads have finished printing."); } }
这段代码中,我们创建了 N 个线程,每个线程负责打印从 0 至 100 中特定的一部分数字。在每个线程的Run
方法中,我们使用步长为 N 的方式遍历该线程负责的数字,并输出该数字。为了模拟真实的场景,我们在输出数字之后让线程休眠 100 毫秒。
在主程序中,我们创建了 N 个PrintThread
对象,并分别给它们分配不同的数字范围。然后,我们启动这 N 个线程,并使用WaitHandle.WaitAll
方法等待它们完成打印任务。最终输出的结果是从 0 至 100 的数字,按顺序依次被打印出来。