Heim  >  Artikel  >  Java  >  Warum erhalte ich eine IllegalMonitorStateException, wenn ich Javas Wait and Notify verwende?

Warum erhalte ich eine IllegalMonitorStateException, wenn ich Javas Wait and Notify verwende?

DDD
DDDOriginal
2024-10-31 16:16:57837Durchsuche

Why Am I Getting IllegalMonitorStateException When Using Java's Wait and Notify?

Java's Wait and Notify: IllegalMonitorStateException verstehen

In Java ermöglichen Wait- und Notify-Methoden Threads, ihre Ausführung zu synchronisieren. Die falsche Verwendung dieser Methoden kann jedoch zu einer IllegalMonitorStateException führen.

Um zu verstehen, warum, analysieren wir den bereitgestellten Code:

Main.java

  • Im Konstruktor erstellt der Hauptthread mehrere Threads und fügt sie einer ArrayList hinzu.
  • Nach der Ausgabe von „Runners ready“ ruft er notifyAll() auf, um alle Threads zu benachrichtigen.

Runner.java

  • In der run()-Methode gibt jeder Läufer eine wait()-Bedingung ein und wartet auf eine Benachrichtigung vom Hauptthread.

Das Problem liegt im Aufruf wait() in Runner.run(). Wenn ein Thread wait() für ein Objekt aufruft, muss er Eigentümer des Monitors dieses Objekts sein. Der Besitz wird durch die Synchronisierung des Objekts festgelegt.

Um das Problem zu beheben, synchronisieren Sie Main.main innerhalb des Aufrufs „wait()“:

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

Dadurch wird sichergestellt, dass der aktuelle Thread Main besitzt. Überprüfen Sie den Hauptmonitor, bevor Sie in die Wait()-Bedingung eintreten.

Das gleiche Prinzip gilt für notify() und notifyAll(). Ein Thread muss Eigentümer des Monitors des Objekts sein, bevor er diese Methoden ausgibt.

Das obige ist der detaillierte Inhalt vonWarum erhalte ich eine IllegalMonitorStateException, wenn ich Javas Wait and Notify 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