Java スレッドが順次実行されているように見える奇妙な動作を観察しています。以下はコードスニペットです
class ThreadUnsafeClass {
private static int y;
public static void incrementY() {
y++;
}
public static int getY() {
return y;
}
}
public class MultiThreadedClass implements Runnable {
int threadId;
MultiThreadedClass (int threadId) {
this.threadId = threadId;
}
@Override
public void run() {
System.out.println("Number:"+ threadId + ";Thread Unsafe Old Value:" + ThreadUnsafeClass.getY());
try {
if (threadId == 1 || threadId ==2) {
Thread.sleep(60000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
ThreadUnsafeClass.incrementY();
System.out.println("Number:"+ threadId + ";Thread Unsafe New Value:" + ThreadUnsafeClass.getY());
}
public static void main (String []args) {
MultiThreadedClass thread1 = new MultiThreadedClass(1);
MultiThreadedClass thread2 = new MultiThreadedClass(2);
MultiThreadedClass thread3 = new MultiThreadedClass(3);
MultiThreadedClass thread4 = new MultiThreadedClass(4);
thread1.run();
thread2.run();
thread3.run();
thread4.run();
}
}
以下は同じ出力です。
Number:1;Thread Unsafe Old Value:0
Number:1;Thread Unsafe New Value:1
Number:2;Thread Unsafe Old Value:1
Number:2;Thread Unsafe New Value:2
Number:3;Thread Unsafe Old Value:2
Number:3;Thread Unsafe New Value:3
Number:4;Thread Unsafe Old Value:3
Number:4;Thread Unsafe New Value:4
上記の出力から、スレッド 1 と 2 が妥当な時間、つまり 60 秒間待機している場合でも、スレッド 3 と 4 は、実行が終了したときにのみ実行されることがわかります。スレッドが並行して実行されないのはなぜですか? また、一方のスレッドがスリープ状態になると、もう一方のスレッドがその実行を進めないのはなぜですか? 私はどこか間違っていますか?