Heim > Java > javaLernprogramm > 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
Freigeben: 2024-10-31 16:16:57
Original
939 Leute haben es durchsucht

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage