Java 等待和通知:克服 IllegalMonitorStateException
在尝试用 Java 实现等待和通知时,您遇到了难以捉摸的 IllegalMonitorStateException。此错误表明当前线程不拥有与正在调用的对象关联的监视器。
了解等待和通知中的所有权
如 Javadocs 中所述wait() 中,线程在对某个对象执行 wait() 之前必须拥有该对象的监视器。同样,notify()和notifyAll()操作也需要调用线程拥有监视器。
将同步应用到Runner类
要解决IllegalMonitorStateException,您可以在执行wait()之前需要确保当前线程拥有Main对象的监视器。您可以通过同步 Runner 类的 run() 方法来实现此目的,如下所示:
<code class="java">class Runner implements Runnable { public void run() { try { synchronized (Main.main) { Main.main.wait(); } } catch (InterruptedException e) { } System.out.println("Runner away!"); } }</code>
通过在 Main.main 上同步,可以确保当前线程在执行之前获取 Main 对象的监视器等待()。这允许您成功等待通知,而不会遇到 IllegalMonitorStateException。
线程所有权注意事项
在 Java 中,线程在执行同步时获取对象监视器的所有权该对象的块或同步方法。当执行离开同步块或方法时,它释放所有权。
以上是为什么在使用 Java 的 Wait 和 Notify 时会出现 IllegalMonitorStateException?的详细内容。更多信息请关注PHP中文网其他相关文章!