1
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 总是最后执行。为什么会这样?可能几百次还不足以看到线程真正的不可预测性?

11 次运行的输出

4

2 回答 2

2

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

那么问题是什么,为什么线程更早完成?

那是因为I2()is run after I()并且 while-loop inI()有效地等待线程首先完成。

于 2012-10-16T18:28:24.580 回答
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()

于 2012-10-16T18:30:25.377 回答