You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java调用Thread.wait报错IllegalMonitorStateException问题求助

解决Java中Thread.wait()抛出IllegalMonitorStateException的问题

错误原因

Java的wait()、notify()、notifyAll()方法有严格的使用规则:调用这些方法的线程必须持有该对象的监视器锁,也就是必须在以该对象为锁的synchronized代码块或方法内部调用。你直接调用t.wait(2000)时,当前主线程并没有获取t对象的锁,所以触发了IllegalMonitorStateException。

两种解决方案

方案1:单纯让线程暂停,用Thread.sleep()更简单

如果你的需求只是让当前线程等待2秒,不需要线程间通信,直接用Thread.sleep()即可,它不需要获取任何锁:

try {
    Thread.sleep(2000); // 当前线程休眠2秒,不会释放已持有的锁
} catch (InterruptedException e) {
    e.printStackTrace();
}

方案2:正确使用wait()方法(配合synchronized)

如果确实需要用wait()实现线程间通信,必须先通过synchronized块获取目标对象的锁:

Thread t = new Thread();
synchronized (t) { // 先获取t对象的监视器锁
    try {
        t.wait(2000); // 此时调用wait不会报错,且会释放t的锁
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

注意:wait()会释放持有的锁,而sleep()不会释放锁,根据实际业务场景选择合适的方法。

内容的提问来源于stack exchange,提问作者Intermaker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:14:54