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