Java 等待和通知:了解 IllegalMonitorStateException
在多线程编程中,wait() 和 notify() 方法允许线程协调其操作。但是,错误地使用这些方法可能会导致 IllegalMonitorStateException。
在给定的代码片段中,在 Main 类中,您尝试在 Main.main 上调用 wait()。但是,您会遇到 IllegalMonitorStateException。这是因为当前线程(主线程)没有持有 Main.main 对象的锁。
要解决这个问题,需要同步调用 wait() 的代码块。这可以通过在要等待的对象上使用synchronized(...) 块来实现。在本例中,它是 Main.main 对象:
<code class="java">public void run() { try { synchronized (Main.main) { Main.main.wait(); } } catch (InterruptedException e) {} System.out.println("Runner away!"); }</code>
通过在 Main.main 对象上进行同步,可以确保当前线程(运行程序线程)在执行等待之前获取该对象的锁()。当Main类调用notifyAll()时,所有运行线程都会收到通知并可以继续执行。
同样的原理也适用于notify()和notifyAll()方法。它们只能由持有同步对象锁的线程调用。
以上是为什么在 Java 中使用 wait() 时会出现 IllegalMonitorStateException?的详细内容。更多信息请关注PHP中文网其他相关文章!