2

こんにちは、Java プログラミングの初心者です。最近、スレッドを勉強しています。このプログラムの出力に問題があります。

class s1 implements Runnable 
{ 
    int x = 0, y = 0; 
    int addX() {x++; return x;} 
    int addY() {y++; return y;} 
    public void run() { 
        for(int i = 0; i < 10; i++){ 
            System.out.println(addX() + " " + addY()); 
        }
    } 
    public static void main(String args[]) 
    { 
        s1 run1 = new s1(); 
        s1 run2 = new s1(); 
        Thread t1 = new Thread(run1); 
        Thread t2 = new Thread(run2); 
        t1.start(); 
        t2.start(); 
    } 
}

私はこのような出力を得ています、

1 1 2 2 1 1 3 3...理由を教えてください。

4

3 に答える 3

5

クラスの各インスタンスにはs1独自の変数があるため、互いに独立してインクリメントされます。インスタンスを 1 つだけ作成した場合、出力は1 1 2 2 3 3 ....

印刷ごとに 2 つのスレッドを使用1 1 2 2 3 3 ...すると、2 つのストリームが混同されていることがわかります。各数値の正しい数値を正しい順序で出力する限り、期待どおりの結果が得られます。スレッドがどのようにスケジュールされるかは期待できません。

1 1 2 2 3 3 1 1 2 2 3 3...そのため、または1 1 1 1 2 2 2 2 3 3 3 3...その他のバリエーションが表示される場合があります。

(運が1 1 1 1 2 2 2 2 3 3 3 3 ...良ければ、ある日、スケジューラが特定の方法でスライスする場合もあります)

編集:呼び出し内のスレッドセーフに関するこの回答もお読みください。println

于 2013-06-10T10:48:44.827 に答える