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()に実行され、while ループがスレッドが最初に終了するのを効果的に待機するためです。 I()I()

于 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 に答える