非法监控状态等待()调用时的异常

2022-08-31 07:03:21

我正在使用Java中的多线程作为我的程序。我已经成功运行线程,但当我使用时,它正在抛出。如何让线程等到收到通知?Thread.wait()java.lang.IllegalMonitorStateException


答案 1

您需要在一个块中才能工作。synchronizedObject.wait()

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

编辑

我以为你的意思是,当你试图在不按住对象锁的情况下获得访问权限时,你的例外是什么。Object.wait()


答案 2

wait在 中定义,而不是 它。显示器打开有点不可预测。ObjectThreadThread

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

private final Object lock = new Object();

通过使用命名类,您可以稍微更轻松地读取诊断信息,但内存成本较小(每个进程约 2K):

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

为了或/一个对象,你需要用语句握住锁。此外,您将需要一个循环来检查唤醒条件(找到有关线程的好文本来解释原因)。waitnotifynotifyAllsynchronizedwhile

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

要通知:

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

在进入多线程处理时,非常值得了解Java语言和锁(和)。但请尽可能使用数据结构。java.util.concurrent.locksjava.util.concurrent.atomicjava.util.concurrent