首頁 > Java > java教程 > 主體

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

Mary-Kate Olsen
發布: 2024-10-31 23:14:29
原創
474 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!