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
相关产品推荐
相关产品推荐

