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
Runner.java
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.
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