问题

我在我的程序中使用java中的多线程。我已成功运行线程,但当我使用Thread.wait()时,它正在throwjava.lang.IllegalMonitorStateException。我怎样才能使线程等到通知为止?


#1 热门回答(145 赞)

你需要在asynchronized块中才能使用Object.wait()

另外,我建议查看并发包而不是旧的学校线程包。他们更安全,方式easier to work with

快乐的编码。
编辑
我假设你的意思是Object.wait(),你的异常就是当你试图获得访问而没有持有对象锁时会发生什么。


#2 热门回答(44 赞)

waitObject中定义,而不是在itThread中定义。监视器Thread有点不可预测。

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

private final Object lock = new Object();

通过使用命名类,你可以以较小的内存成本(每个进程大约2K)轻松读取诊断信息:

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

为了waitnotify / notifyAllan对象,你需要持有2777705207语句的锁。此外,你将需要awhileloop来检查唤醒条件(找到一个关于线程的好文本来解释原因)。

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

通知:

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

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


#3 热门回答(20 赞)

我知道这个帖子已经快2年了但是仍然需要关闭它,因为我也遇到了同样问题的Q / A会话......

请一遍又一遍地阅读illegalMonitorException的这个定义......

抛出IllegalMonitorException以指示线程已尝试在对象的监视器上等待,或者在没有指定监视器的情况下通知在对象监视器上等待的其他线程。

这一行一次又一次地说,IllegalMonitorException出现时,出现了两种情况之一....

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

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

有些人可能得到了他们的答案......谁都没有,那么请检查2个陈述....
synchronized(object)object.wait()
如果两个
对象
相同...则不会发生illegalMonitorException。

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


原文链接