调用WAIT()的IllegalMonitorStateException异常

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (33)

我正在用java中的多线程作为我的程序。我已经成功地运行了线程,但是当我使用Thread.wait(),它在扔java.lang.IllegalMonitorStateException,我如何使线程等待直到它被通知?

提问于
用户回答回答于

你需要在一个synchronized块,以便Object.wait()去工作。

此外,我建议查看并发包,而不是旧的线程包。

用户回答回答于

wait定义为Object,而不是Thread,监控器Thread有点难以预测。

尽管所有Java对象都有监视器,但通常最好有一个专用锁:

private final Object lock = new Object();

通过使用一个命名类,可以以较小的内存成本(每个进程大约2K)来稍微轻松地读取诊断信息:

private static final class Lock { }
private final Object lock = new Lock();

为了waitnotify/notifyAll对象时,需要用synchronized声明。另外,你还需要一个while循环来检查唤醒条件(找到一个好的线程文本来解释原因)。

synchronized (lock) {
    while (!isWakeupNeeded()) {
        lock.wait();
    }
}

通知:

synchronized (lock) {
    makeWakeupNeeded();
    lock.notifyAll();
}

理解Java语言和java.util.concurrent.locks锁(和)java.util.concurrent.atomic)当进入多线程时。但使用java.util.concurrent数据结构。

扫码关注云+社区