5

この質問はおそらく簡単に答えることができますが、私にはわかりません。この問題の「原因」を見つけるために、この小さなコードが残されるまで問題を減らしました。スレッドの ArrayList をループで埋めようとしています。

public static int u=0;

public void test(){
    while (u <10) {
        synchronized(threadList){
            threadList.add(u, new Thread(){                
                @Override public void run(){                    
                    System.out.println("Thread at Index: " + u);                     
                } 
            });
        }
        u++;            
    }

    threadList.get(2).start();    
}

最後の行では、インデックス '2' でスレッドを開始して、上記のループをテストしたかったのです。コンソールに「Thread at Index: 2」が表示されることを期待していますが、代わりに「Thread at Index: 10」と表示されます。「.get(int)」メソッドにどの整数を記述しても、インデックスを受け取ります。 「10」。

何故ですか?そして、これを修正する方法は?

スレッドの作成は機能しているようです...では、整数「u」が問題ですか?

どんな種類の助けにも感謝します! 前もって感謝します!

4

3 に答える 3

9

メソッドで参照uする場合run

@Override public void run(){                    
    System.out.println("Thread at Index: " + u);                     
} 

の現在の値uが取得されます。ループの最後でスレッドが実行されると、その値は10.

以下を試してください

public static int u = 0;

public void test(){
    while (u <10) {
        synchronized(threadList){
            threadList.add(u, new Thread(){     
                int i = u;

                @Override public void run(){                    
                    System.out.println("Thread at Index: " + i);                     
                } 
            });
        }
        u++;            
    }

    threadList.get(2).start();    
}

匿名クラスでは、コンストラクターが呼び出されたときにThreadインスタンス フィールドiを値に設定し、実行時にその値を出力しています。urun()

uまだ実行されていないコンテキスト、スレッドで参照します。メソッドがrun()最終的に呼び出されると、プログラムは変数を評価しますuが、プログラムの実行のその時点で、その値は 10 になります。代わりに上記を実行すると、変数iはその正確な瞬間の値を保持します。 . これは、 newThreadが開始および実行されると、フィールドの初期化が発生し、uすぐに評価されるためです。

于 2013-08-23T21:46:49.673 に答える
1
    while (u <10) {
        synchronized(threadList){

            final int u_final = u;

            threadList.add(u, new Thread(){                
                @Override public void run(){                    
                    System.out.println("Thread at Index: " + u_final );
                } 
            });
        }
        u++;            
    }

変数を使用するfinalと、その値は決して変化しないため、その値がどうなるかは明らかです。

于 2013-08-23T21:56:33.593 に答える