Java 用另一个对象监视一个对象
Java monitoring an object with another object
我想说我试图在这个网站上找到一些答案但我无法管理,这也是我的第一个问题所以如果我把它写错格式等我很抱歉...
我正在努力学习 java,现在正在努力理解线程部分。到目前为止,我了解了一些基础知识,我想尝试一下:一名中尉 class 与一名士兵 class 共享监视器锁,但我在某个地方失败了。
编辑:我想中尉等到士兵说出他的第一句话,然后他下达命令。但是当士兵试图释放锁时,由于通知方法,我得到了一个监视器错误。
"Exception in thread "线程 1" java.lang.IllegalMonitorStateException."
P.S:我知道有更简单的方法,但我正在尝试使用 wait¬ify。
public class Lieutenant {
private boolean waitForCommand = true;
public void setWaitForCommand(boolean waitForCommand) {
this.waitForCommand = waitForCommand;
}
public synchronized void giveOrder() {
while (waitForCommand) {
try {
wait();
} catch (InterruptedException e) {
e.getStackTrace();
}
System.out.println("I said run soldier! RUN!");
}}}
public class Soldier {
private final Lieutenant lieutenant;
public Soldier(Lieutenant lieutenant) {
this.lieutenant = lieutenant;
}
public void getOrder() {
synchronized (this.lieutenant) {
System.out.println("Sir! Yes, sir!");
lieutenant.setWaitForCommand(false);
notifyAll();
}}}
class Main {
public static void main(String[] args) {
Lieutenant lieutenant = new Lieutenant();
Soldier soldier = new Soldier(lieutenant);
new Thread(new Runnable() {
@Override
public void run() {
lieutenant.giveOrder();
}}).start();
new Thread(new Runnable() {
@Override
public void run() {
soldier.getOrder();
}}).start();
}}
这里的直接问题是这个方法:
synchronized (this.lieutenant) {
System.out.println("Sir! Yes, sir!");
lieutenant.setWaitForCommand(false);
notifyAll();
}}
同步块在 this.lieutenant 上持有锁,但您正试图在 [=] 上调用 notifyAll() 20=]this,你没有锁定它。
如果进行此更改
synchronized (this.lieutenant) {
System.out.println("Sir! Yes, sir!");
lieutenant.setWaitForCommand(false);
this.lieutenant.notifyAll();
}}
它应该会更好用。但正如评论中所述,您不能保证 giveOrder 会在 getOrder.
之前被调用
我想说我试图在这个网站上找到一些答案但我无法管理,这也是我的第一个问题所以如果我把它写错格式等我很抱歉...
我正在努力学习 java,现在正在努力理解线程部分。到目前为止,我了解了一些基础知识,我想尝试一下:一名中尉 class 与一名士兵 class 共享监视器锁,但我在某个地方失败了。
编辑:我想中尉等到士兵说出他的第一句话,然后他下达命令。但是当士兵试图释放锁时,由于通知方法,我得到了一个监视器错误。 "Exception in thread "线程 1" java.lang.IllegalMonitorStateException."
P.S:我知道有更简单的方法,但我正在尝试使用 wait¬ify。
public class Lieutenant {
private boolean waitForCommand = true;
public void setWaitForCommand(boolean waitForCommand) {
this.waitForCommand = waitForCommand;
}
public synchronized void giveOrder() {
while (waitForCommand) {
try {
wait();
} catch (InterruptedException e) {
e.getStackTrace();
}
System.out.println("I said run soldier! RUN!");
}}}
public class Soldier {
private final Lieutenant lieutenant;
public Soldier(Lieutenant lieutenant) {
this.lieutenant = lieutenant;
}
public void getOrder() {
synchronized (this.lieutenant) {
System.out.println("Sir! Yes, sir!");
lieutenant.setWaitForCommand(false);
notifyAll();
}}}
class Main {
public static void main(String[] args) {
Lieutenant lieutenant = new Lieutenant();
Soldier soldier = new Soldier(lieutenant);
new Thread(new Runnable() {
@Override
public void run() {
lieutenant.giveOrder();
}}).start();
new Thread(new Runnable() {
@Override
public void run() {
soldier.getOrder();
}}).start();
}}
这里的直接问题是这个方法:
synchronized (this.lieutenant) {
System.out.println("Sir! Yes, sir!");
lieutenant.setWaitForCommand(false);
notifyAll();
}}
同步块在 this.lieutenant 上持有锁,但您正试图在 [=] 上调用 notifyAll() 20=]this,你没有锁定它。
如果进行此更改
synchronized (this.lieutenant) {
System.out.println("Sir! Yes, sir!");
lieutenant.setWaitForCommand(false);
this.lieutenant.notifyAll();
}}
它应该会更好用。但正如评论中所述,您不能保证 giveOrder 会在 getOrder.
之前被调用