私は5つの異なるスレッドを作成しようとしておりrun
、静的変数のカウントを1ずつ増やすたびにメソッドに静的オブジェクトを出力しようとしています
プログラムのサンプル出力は次のとおりです。
pool-1-thread-1 Static Value before update 19
Thread going to sleep pool-1-thread-1
pool-1-thread-4 Static Value before update 19
Thread going to sleep pool-1-thread-4
pool-1-thread-3 Static Value before update 19
Thread going to sleep pool-1-thread-3
pool-1-thread-2 Static Value before update 19
Thread going to sleep pool-1-thread-2
pool-1-thread-5 Static Value before update 19
Thread going to sleep pool-1-thread-5
Thread coming out of sleep pool-1-thread-3 StaticTest.sInt 19
Thread coming out of sleep pool-1-thread-4 StaticTest.sInt 19
Thread coming out of sleep pool-1-thread-1 StaticTest.sInt 19
Thread coming out of sleep pool-1-thread-5 StaticTest.sInt 19
Thread coming out of sleep pool-1-thread-2 StaticTest.sInt 19
**pool-1-thread-5 OLD value 22 Static Value after update 23**
pool-1-thread-1 OLD value 21 Static Value after update 22
pool-1-thread-4 OLD value 20 Static Value after update 21
pool-1-thread-3 OLD value 19 Static Value after update 20
pool-1-thread-2 OLD value 23 Static Value after update 24
ここで私の質問は、スレッド 3 が最初にスリープ状態から抜け出したので、最初に印刷されたに違いありませんが、最初に印刷されたスレッド 5 であり、それも値 22 です。つまり、静的変数は、スレッド 5 がそれを取得する前に 3 回インクリメントされました、しかし、インクリメントされた値を私に出力しているときにランダムな順序が表示されるのはなぜですか。スリープから抜け出したのと同じ順序で印刷されているはずです。つまり、スレッド 3/4/1/5/2
考えを注いでください?スレッドがスリープ後に実行状態に戻った後のランダムな動作がなぜ欠けているのか
package com.test.concurrency;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class StaticTest {
public static Integer sInt = new Integer(19);
public static void main(String[] args) {
ExecutorService es = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {
es.execute(new StaticTask());
}
}
}
class StaticTask implements Runnable {
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name + " Static Value before update "
+ StaticTest.sInt);
try {
System.out.println("Thread going to sleep " + name);
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread coming out of sleep " + name + " StaticTest.sInt " + StaticTest.sInt);
int local = StaticTest.sInt;
StaticTest.sInt = new Integer(local + 1);
System.out.println(name + " OLD value " + local +" Static Value after update "
+ StaticTest.sInt);
}
}