Heim >Java >javaLernprogramm >Warum erhalte ich eine IllegalMonitorStateException, wenn ich Javas Wait and Notify verwende?
Java Wait and Notify: IllegalMonitorStateException überwinden
Bei Ihrem Versuch, Wait and Notify in Java zu implementieren, sind Sie auf die schwer fassbare IllegalMonitorStateException gestoßen. Dieser Fehler weist darauf hin, dass der aktuelle Thread nicht Eigentümer des Monitors ist, der mit dem Objekt verknüpft ist, auf das aufgerufen wird.
Grundlegendes zum Besitz in Warte- und Benachrichtigungsfunktionen
Wie in den Javadocs für angegeben wait() muss ein Thread Eigentümer des Monitors eines Objekts sein, bevor er wait() für dieses Objekt ausführt. In ähnlicher Weise erfordern die Vorgänge notify() und notifyAll() auch, dass der aufrufende Thread Eigentümer des Monitors ist.
Anwenden der Synchronisierung auf die Runner-Klasse
Um die IllegalMonitorStateException aufzulösen, müssen Sie Sie müssen sicherstellen, dass der aktuelle Thread den Monitor des Hauptobjekts besitzt, bevor Sie wait() ausführen. Sie können dies erreichen, indem Sie die run()-Methode der Runner-Klasse wie folgt synchronisieren:
<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>
Durch die Synchronisierung auf Main.main stellen Sie sicher, dass der aktuelle Thread vor der Ausführung den Monitor des Main-Objekts erhält Warten(). Dadurch können Sie erfolgreich auf eine Benachrichtigung warten, ohne auf die IllegalMonitorStateException zu stoßen.
Hinweis zum Thread-Eigentum
In Java erwirbt ein Thread den Besitz eines Objektmonitors, wenn er synchronisiert ausgeführt wird Blöcke oder synchronisierte Methoden dieses Objekts. Es gibt den Besitz frei, wenn die Ausführung den synchronisierten Block oder die synchronisierte Methode verlässt.
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!