在这个简单的多线程示例中,为什么Main()中的最后一个方法总是最后执行?

时间:2012-10-16 18:23:45

标签: c# multithreading

static int i = 0;

static void Main()
{
    ThreadTest tt = new ThreadTest();
    new Thread(tt.Incr).Start();
    tt.I();
    tt.I2();
}

void Incr()
{
    for(int x = 0; x < 3; x++)
    {
        Console.WriteLine(i);
        i++;
    }
}

void I()
{
    while(i <= 3)
    {
        if(i==3)
            break;
        Console.WriteLine("Value of i in I:{0}",i);
    }
}

void I2()
{
    Console.WriteLine("\t\tFinally i is:{0}\n\n",i);
}

我现在运行这段代码几百次,发现I2总是执行最后一次。为什么会这样?可能是几百次还不足以看到线程真正的不可预测性?

Output of 11 runs

2 个答案:

答案 0 :(得分:2)

好吧,I2() Main()中的最后一个方法,它没有以任何方式进行线程化。

那么问题是,为什么线程会提前完成?

那是因为I2()I()之后运行I()中的while循环有效地等待线程先完成。

答案 1 :(得分:0)

方法I2将始终执行。这与线程无关。

static void Main()
{
    ThreadTest tt = new ThreadTest();
    new Thread(tt.Incr).Start();
    tt.I(); // This will be executed first
    tt.I2(); // This will be executed last
}

新启动的线程和当前线程的流程不同步,但当前线程将以同步方式继续其操作,按照出现的顺序执行语句。在这种情况下,I()之前会调用I2()