猿问

WAIT()调用的IllegalMonitorStateException异常

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



慕仙森
浏览 834回答 3
3回答

炎炎设计

你需要在一个synchronized块,以便.Object.wait()去工作。此外,我建议查看并发包,而不是旧的线程包。他们更安全更容易使用.编码愉快。编辑我以为你是说Object.wait()因为您的例外是当您试图获得访问而不持有对象锁时会发生什么。

慕姐8265434

wait定义为Object,而不是Thread..监控器Thread有点难以预测。尽管所有Java对象都有监视器,但通常最好有一个专用锁:private final Object lock = new Object();通过使用一个命名类,您可以较小的内存成本(每个进程大约2K)来稍微轻松地读取诊断信息:private static final class Lock { }private final Object lock = new Lock();为了wait或notify/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数据结构。

小怪兽爱吃肉

我知道这个线程已经有将近2年的历史了,但是我仍然需要关闭这个线程,因为我也用同样的问题来参加这个Q/A会话.请一遍又一遍地阅读这个非法监测异常的定义.。抛出IllegalMonitorException表示线程试图在对象的监视器上等待,或者通知在对象监视器上等待的其他线程,而不拥有指定的监视器。这一行一遍又一遍地说,IllegalMonitorException是在2种情况之一发生时出现的.在没有拥有指定监视器的情况下等待对象的监视器。2>通知在对象监视器上等待的其他线程,而不拥有指定的监视器。有些人可能会得到他们的答案.。谁都不知道,那就请查查两份对账单.同步(对象)对象.等待()如果两者都是对象都是一样的.。那么就不会出现非法的MonitorException了。再读一遍IllegalMonitorException定义,你不会再忘记它了.
随时随地看视频慕课网APP

相关分类

Java
我要回答