首頁 >Java >java教程 >為什麼在 Java 中使用 wait() 和 notification() 時會收到 IllegalMonitorStateException?

為什麼在 Java 中使用 wait() 和 notification() 時會收到 IllegalMonitorStateException?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-31 23:14:29528瀏覽

Why am I getting an IllegalMonitorStateException when using wait() and notify() in Java?

Java Wait 和Notify 中的IllegalMonitorStateException

理解Wait 和Notify

理解Wait 和Notify

wae() 和notnify(類別用於Java 中的執行緒間通訊。 wait() 導致呼叫執行緒等待,直到另一個執行緒對同一物件呼叫 notification(),釋放該執行緒繼續執行。

IllegalMonitorStateException

IllegalMonitorStateException 是當執行緒嘗試等待物件而不持有其內在鎖時拋出。該鎖是透過使用同步區塊或方法在物件上進行同步來取得的。

在提供的程式碼中

您提供的程式碼遇到此異常,因為 wait() 方法被呼叫時沒有在適當的物件上進行同步。在 Runner 類別中,在 run() 方法中呼叫 wait() 方法。但是,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 上同步 run() 方法object,這是呼叫 wait() 的物件。這可確保當前執行緒在嘗試等待之前持有 Main.main 上的內在鎖。

此同步可確保目前執行緒在呼叫 wait() 之前取得 Main.main 上的內在鎖,從而防止拋出 IllegalMonitorStateException。

以上是為什麼在 Java 中使用 wait() 和 notification() 時會收到 IllegalMonitorStateException?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn