wait() 调用时出现 IllegalMonitorStateException

新手上路,请多包涵

我在我的程序中使用 java 中的多线程。我已经成功运行线程但是当我使用 Thread.wait() 时,它正在抛出 java.lang.IllegalMonitorStateException 。如何让线程等到它收到通知?

原文由 Prakash Panjwani 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 564
2 个回答

您需要在 synchronized 块中才能使 Object.wait() 工作。

另外,我建议查看并发包,而不是老式的线程包。它们更安全, 更容易使用

编辑

我以为您的意思是 Object.wait() 因为当您尝试在不持有对象锁的情况下获得访问权限时会发生例外情况。

原文由 reccles 发布,翻译遵循 CC BY-SA 4.0 许可协议

waitObject --- 中定义,而不是 ThreadThread 上的监视器有点不可预测。

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

 private final Object lock = new Object();

通过使用命名类,您可以以较小的内存成本(每个进程约 2K)更容易地阅读诊断信息:

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

In order to wait or notify / notifyAll an object, you need to be holding the lock with the synchronized statement.此外,您将需要一个 while 循环来检查唤醒条件(找到有关线程的好文本来解释原因)。

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

通知:

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

进入多线程时,了解 Java 语言和 java.util.concurrent.locks 锁(和 java.util.concurrent.atomic )是非常值得的。但是尽可能使用 java.util.concurrent 数据结构。

原文由 Tom Hawtin - tackline 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题