我在我的程序中使用 java 中的多线程。我已经成功运行线程但是当我使用 Thread.wait()
时,它正在抛出 java.lang.IllegalMonitorStateException
。如何让线程等到它收到通知?
原文由 Prakash Panjwani 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在我的程序中使用 java 中的多线程。我已经成功运行线程但是当我使用 Thread.wait()
时,它正在抛出 java.lang.IllegalMonitorStateException
。如何让线程等到它收到通知?
原文由 Prakash Panjwani 发布,翻译遵循 CC BY-SA 4.0 许可协议
wait
在 Object
--- 中定义,而不是 Thread
。 Thread
上的监视器有点不可预测。
虽然所有 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 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
您需要在
synchronized
块中才能使Object.wait()
工作。另外,我建议查看并发包,而不是老式的线程包。它们更安全, 更容易使用。
编辑
我以为您的意思是
Object.wait()
因为当您尝试在不持有对象锁的情况下获得访问权限时会发生例外情况。