多线程 - 不同时工作

时间:2012-04-04 21:15:06

标签: c# multithreading

我想实现一个多线程系统(两个线程会这样做),我按照教程

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

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

2 个答案:

答案 0 :(得分:2)

缺点是线程在CLR和OS安排执行时执行,基于许多实现细节,这些细节因操作系统和操作系统以及CPU而异。

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

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

答案 1 :(得分: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

但是,这只表明您在线程方面无法保证任何订单。