Heim  >  Artikel  >  Java  >  Warum erhalte ich eine IllegalMonitorStateException, wenn ich wait() und notify() in Java verwende?

Warum erhalte ich eine IllegalMonitorStateException, wenn ich wait() und notify() in Java verwende?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-31 23:14:29458Durchsuche

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

IllegalMonitorStateException in Java Wait and Notify

Warte und Notify verstehen

Die Methoden wait() und notify() von Die Object-Klasse wird für die Inter-Thread-Kommunikation in Java verwendet. wait() bewirkt, dass der aufrufende Thread wartet, bis ein anderer Thread notify() für dasselbe Objekt aufruft, wodurch der Thread freigegeben wird, um die Ausführung fortzusetzen.

IllegalMonitorStateException

Die IllegalMonitorStateException ist Wird ausgelöst, wenn ein Thread versucht, auf ein Objekt zu warten, ohne seine intrinsische Sperre aufrechtzuerhalten. Diese Sperre wird durch die Synchronisierung des Objekts mithilfe synchronisierter Blöcke oder Methoden erworben.

Im bereitgestellten Code

Der von Ihnen bereitgestellte Code stößt auf diese Ausnahme, weil die Methode wait() wird aufgerufen, ohne auf das entsprechende Objekt zu synchronisieren. In der Runner-Klasse wird die Methode wait() innerhalb der Methode run() aufgerufen. Allerdings ist die run()-Methode auf keinem Objekt synchronisiert.

Lösung

Um dies zu beheben, müssen Sie die run()-Methode auf Main.main synchronisieren Objekt, das das Objekt ist, für das wait() aufgerufen wird. Dadurch wird sichergestellt, dass der aktuelle Thread die intrinsische Sperre für Main.main hält, bevor er versucht zu warten.

<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>

Diese Synchronisierung stellt sicher, dass der aktuelle Thread die intrinsische Sperre für Main.main erhält, bevor er wait() aufruft, was verhindert dass die IllegalMonitorStateException nicht ausgelöst wird.

Das obige ist der detaillierte Inhalt vonWarum erhalte ich eine IllegalMonitorStateException, wenn ich wait() und notify() in Java verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn