为了账号安全,请及时绑定邮箱和手机立即绑定

WAIT()调用的IllegalMonitorStateException异常

WAIT()调用的IllegalMonitorStateException异常

慕仙森 2019-07-13 10:25:34
我正在使用java中的多线程作为我的程序。我已经成功地运行了线程,但是当我使用Thread.wait(),它在扔java.lang.IllegalMonitorStateException..我如何使线程等待直到它被通知?
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

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

此外,我建议查看并发包,而不是旧的线程包。他们更安全更容易使用.

编码愉快。

编辑

我以为你是说Object.wait()因为您的例外是当您试图获得访问而不持有对象锁时会发生什么。


查看完整回答
反对 回复 2019-07-13
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

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数据结构。


查看完整回答
反对 回复 2019-07-13
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

我知道这个线程已经有将近2年的历史了,但是我仍然需要关闭这个线程,因为我也用同样的问题来参加这个Q/A会话.

请一遍又一遍地阅读这个非法监测异常的定义.。

抛出IllegalMonitorException表示线程试图在对象的监视器上等待,或者通知在对象监视器上等待的其他线程,而不拥有指定的监视器。

这一行一遍又一遍地说,IllegalMonitorException是在2种情况之一发生时出现的.

在没有拥有指定监视器的情况下等待对象的监视器。

2>通知在对象监视器上等待的其他线程,而不拥有指定的监视器。

有些人可能会得到他们的答案.。谁都不知道,那就请查查两份对账单.

同步(对象)

对象.等待()

如果两者都是对象都是一样的.。那么就不会出现非法的MonitorException了。

再读一遍IllegalMonitorException定义,你不会再忘记它了.


查看完整回答
反对 回复 2019-07-13
  • 3 回答
  • 0 关注
  • 833 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信