私は2つのスレッドを開始しています.1,3,5、...、2つのスレッドは、2つのT2プリント2,4,6 ....です。スレッドの実行が予測不可能
public class T1T2Print {
public static void main(String[] args) {
Counter c = new Counter();
c.count = 1;
printThread t1 = new printThread(c);
Thread T1 = new Thread(t1);
T1.setName("T1");
printThread t2 = new printThread(c);
Thread T2 = new Thread(t2);
T2.setName("T2");
T2.start();
T1.start();
}
}
class printThread implements Runnable {
public Counter count;
public int reminder;
public printThread(Counter count) {
this.count = count;
}
public void run() {
for (int i = 1; i <= 5; i++) {
synchronized (count) {
String name = Thread.currentThread().getName();
if (count.count % 2 != 0 && !name.equals("T1")) {
try {
count.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println(name + " :: " + count.count);
count.count++;
count.notify();
}
if (count.count % 2 == 0 && !name.equals("T2")) {
try {
count.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println(name + " :: " + count.count);
count.count++;
count.notify();
}
}
}
}
}
出力は以下の通りです:
T1 :: 1
T2 :: 2
T1 :: 3
T2 :: 4
T1 :: 5
T2 :: 6
T1 :: 7
T2 :: 8
T1 :: 9
T2 :: 10
が、私は以下のように出力が変化
T1.start();
T2.start();
にスレッドを開始する順序を変更、なぜこの動作
T1 :: 1
T2 :: 2
T2 :: 3
T2 :: 4
T2 :: 5
T2 :: 6
T2 :: 7
T2 :: 8
T2 :: 9
T2 :: 10
T2 :: 11
T1 :: 12
T1 :: 13
T1 :: 14
T1 :: 15
T1 :: 16
T1 :: 17
T1 :: 18
T1 :: 19
私の推測では、あなたがここで詳細に明らかでない何か間違ったことをやっているです:
あなた
if
文は次のようなものに固定することができます。 'wait()'を呼び出す場合は、それを行う必要があります。私はそれが待っていることを示すためにprintステートメントを追加します。 –