class Useless {
public static boolean b = true;
public synchronized void u1() {
try {
while (b == true)
wait();
} catch (InterruptedException i) {
}
}
public synchronized void u2() {
if (b == true) {
b = false;
}
notify();
}
}
public class SleepMessages extends Thread {
private Useless u;
public SleepMessages(Useless u) {
this.u = u;
}
public void run() {
String importantInfo[] = { "Mares eat oats", "Does eat oats" };
for (int i = 0; i < importantInfo.length; i++) {
u.u1();
System.out.println(importantInfo[i] + " - " + getName());
try {
sleep(2000);
} catch (InterruptedException e) {
}
}
}
public static void main(String args[]) throws InterruptedException {
Useless u = new Useless();
Thread t1 = new SleepMessages(u);
t1.setName("t1");
Thread t2 = new SleepMessages(u);
t2.setName("t2");
t1.start();
t2.start();
sleep(2000);
System.out.println("Here they go!...");
t1.interrupt();
sleep(1000);
t2.interrupt();
u.u2();
sleep(1000);
u.u2();
}
}
この小さなプログラムの出力は次のようになります: Here they go!... Mares eat oats - t1 Mares eat oats - t2 Does eat oats - t2 Does eat oats - t1
私の質問は、スレッド t2 が catch(InterruptedException e) に入る唯一のスレッドである理由と、結果が次のようなものではない理由です。
ほら、どうぞ!... 雌馬はオート麦を食べる - t1 雌馬はオート麦を食べる - t2 オート麦を食べる - t1 オート麦を食べる - t2