通过 N 个线程顺序循环打印从 0 至 100

发布时间 2023-03-29 23:48:28作者: elegydance
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 的数字,按顺序依次被打印出来。