„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum erhalte ich eine IllegalMonitorStateException, wenn ich Javas Wait and Notify verwende?

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

Veröffentlicht am 14.11.2024
Durchsuche:984

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.
  • Nachdem „Runners bereit“ gedruckt wurde, ruft er notifyAll() auf, um alle Threads zu benachrichtigen.

Runner.java

  • In der run()-Methode gibt jeder Runner 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 Synchronisieren auf dem Objekt festgelegt.

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

class Runner implements Runnable {
  public void run() {
    try {
      synchronized (Main.main) {
        Main.main.wait();
      }
    } catch (InterruptedException e) {}
    System.out.println("Runner away!");
  }
}

Dadurch wird sichergestellt, dass der aktuelle Thread den Monitor von Main.main besitzt, bevor er in die Wait()-Bedingung eintritt.

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

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3