gpt4 book ai didi

java - 试图让 protected block 工作

转载 作者:行者123 更新时间:2023-11-30 06:54:03 25 4
gpt4 key购买 nike

我不明白为什么我的代码不能正常工作。我希望第一个线程等待 4 秒,以便第二个线程将共享 boolean 值“joy”设置为 true,然后第一个线程打印出“Joy has been achieved!”。

当我运行代码时,我得到了这个输出:

"No Joy Yet..."

"Notifying Joy"

然后就卡住了,不继续了。如果我的理解是正确的,从我的 notifyJoy() 方法调用的 notifyAll() 方法应该将 t1 从它的 wait() 中唤醒,然后,由于共享的静态 boolean 变量 joy 现在为真,“Joy 已经实现了!”应该打印到控制台。

我正在使用 Oracle 的“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();
}
}

最佳答案

您正在调用 wait()notifyAll()在不同的显示器上,更具体地说,在两个不同的内置显示器上 JoyRider实例。

如果引入专用锁对象:

private static final Object LOCK = new Object();

并更改您的 run()方法一点:

synchronized (LOCK) {
if (flag) {
System.out.println("Notifying Joy");
JOY = true;
LOCK.notifyAll();
}
else {
while (!JOY) {
System.out.println("No Joy Yet...");
try {
LOCK.wait();
}
catch (InterruptedException e) {}
}
System.out.println("Joy has been achieved!");
}
}

您应该能够以正确的顺序看到所有预期的打印件。

关于java - 试图让 protected block 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36817437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com