我不明白为什么我的代码无法正常工作。我期望第一个Thread等待4秒钟,让第二个Thread将共享布尔值“joy”设置为true,然后让第一个Thread打印出“Joy已经实现!”。试图让守卫块工作
当我运行代码,我得到这样的输出:
“没有喜悦然而......”
“通知喜悦”
然后它冻结起来,没有按”继续。如果我的理解是正确的,那么从我的notifyJoy()方法中调用的notifyAll()方法应该从其wait()中唤醒t1,然后,由于共享静态布尔变量joy现在成立,所以“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();
}
}