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.

之前被调用