私のコードが正しく動作しない理由を理解できません。私は最初のスレッドが2番目のスレッドが共有のブール値「喜び」をtrueに設定してから、最初のスレッドが「喜びが達成されました!」というメッセージを4秒間待つことを期待します。保護されたブロックを稼働させようとしています
私は、コードを実行すると、私はこの出力を得る:
"いいえ喜びしかし..."
"届出事業喜び"
そして、それがフリーズしてdoesnの」に続行する。私の理解が正しい場合、notifyJoy()メソッドから呼び出されたnotifyAll()メソッドはwait()からt1を起動し、共有静的ブール変数joyがtrueになっているので、 "Joyは達成されました!コンソールに印刷する必要があります。
私はオラクルの「Javaチュートリアル」の第13章から作業しています。具体的なセクションへのリンクはJava Tutorial Websiteです。私は彼らが持っているものから脱して少しの例を挙げているが、私が間違っていることを理解できないようだ。どんな助けもありがとう。ここに私のコードの完全なコピーはご参考用です:
public class JoyTime {
public static void main(String[] args) {
JoyRider j1 = new JoyRider(false);
JoyRider j2 = new JoyRider(true);
Thread t1 = new Thread(j1, "J1");
Thread t2 = new Thread(j2, "J2");
t1.start();
try {
Thread.sleep(4000);
}
catch (InterruptedException e) {}
t2.start();
}
}
class JoyRider implements Runnable {
private static boolean joy = false;
private boolean flag;
public JoyRider(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
synchronized(this) {
if (flag) {
notifyJoy();
}
else {
while (!joy) {
System.out.println("No Joy Yet...");
try {
this.wait();
}
catch (InterruptedException e) {}
}
System.out.println("Joy has been achieved!");
}
}
}
public synchronized void notifyJoy() {
System.out.println("Notifying Joy");
joy = true;
notifyAll();
}
}