提问者:小点点

等待()调用时的IllegalMontivorStateException


我在程序的java中使用了多线程。我已经成功运行了线程,但是当我使用Thread. wait()时,它会抛出java.lang.Illegal监控状态异常。我如何让线程等待直到它被通知?


共3个答案

匿名用户

您需要在要等待的对象的同步块中才能使Object. wait()工作。

此外,我建议查看并发包而不是旧的学校线程包。它们更安全,更易于使用。

我假设您的意思是Object. awa(),因为您的异常是当您尝试在不持有对象锁的情况下获得访问权限时发生的情况。

匿名用户

等待是在Object中定义的,而不是它ThreadThread上的监视器有点不可预测。

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

private final Object lock = new Object();

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

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

为了等待通知/通知所有对象,您需要使用同步语句保持锁。此外,您将需要一个while循环来检查唤醒条件(在线程上找到一个好的文本来解释原因)。

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

通知:

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

在进入多线程时,非常值得了解Java语言和java. util.con当前.lock锁(和java.util.con当前.原子)。但是尽可能使用java.util.con当前数据结构。

匿名用户

我知道这个线程已经快2年了,但仍然需要关闭它,因为我也带着同样的问题来到了这个问答环节……

请一遍又一遍地阅读这个定义…

抛出Illegal监视器异常以指示线程已尝试等待对象的监视器或通知其他线程正在等待对象的监视器而不拥有指定的监视器。

这一行一次又一次地说,当两种情况中的一种发生时,就会出现非法监控异常……

1

2

有些人可能已经得到了答案…谁都没有,那么请检查两个陈述….

同步对象

等待

如果两个对象是相同的……那么就不会出现非法监视器异常。

现在再次阅读IllegalMonorException定义,你不会再忘记它了……