-4

我想实现一个多线程系统(两个线程就可以了),我按照教程

    Thread t1 = new Thread(new ThreadStart(threadA));
    Thread t2 = new Thread(new ThreadStart(threadB));
    t1.Start();
    t2.Start();

输出对我来说是出乎意料的,因为它显示:“threadA”“threadA”“threadA”“threadB”“threadB”“threadB”。
我的代码有问题吗?非常感谢。

4

2 回答 2

2

简而言之,线程在 CLR 和 OS 调度它们执行时执行,基于许多实现细节,这些细节因操作系统和 CPU 而异。

使用 Thread 类确实避免了 ThreadPool,这是 CLR 对线程调度的大部分控制级别,但 OS 内核仍然决定线程何时运行。在您的情况下,每个线程只是将三行输出到控制台,完全可以预期一个线程会在操作系统启动另一个线程之前完成。

但是,您永远无法保证线程运行的顺序。因此,如果您要循环此代码(使用 Join() 语句)并运行 100 次,您可能会看到“threadA”和“threadB”的几种不同排列,因为操作系统在不同时间调度了线程。如果两个 EU 完全同时可用,将会有很大的重叠;如果 threadA 被认为不如 threadB 重要,则 threadB 可能会在 threadA 开始之前完整执行。

于 2012-04-04T21:26:45.207 回答
1

发生这种情况是因为在您从t1.Start()到的时间里t2.Start(),您t1已经完成了。

如果你想看到你的代码有一点交替,请尝试这样的事情

Thread t1 = new Thread(
    new ThreadStart(()=>
    {
        for(int i = 0; i < 3; i++)
        {
            System.Console.WriteLine("ThreadA");    
            Thread.Sleep(3000)
        }
    }));
Thread t2 = new Thread(
    new ThreadStart(()=>
    {
        for(int i = 0; i < 3; i++)
        {
            System.Console.WriteLine("ThreadB");    
            Thread.Sleep(1000)
        }
    }));
t1.Start();
t2.Start();

它应该打印如下内容:

ThreadA
ThreadB
ThreadB
ThreadA
ThreadB
ThreadA

但是,这仅表明您无法保证线程的任何顺序。

于 2012-04-04T21:27:54.140 回答