Heim  >  Artikel  >  Java  >  Warum erhalte ich „IllegalMonitorStateException“, wenn ich „wait()“ in Java verwende?

Warum erhalte ich „IllegalMonitorStateException“, wenn ich „wait()“ in Java verwende?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-01 05:25:02518Durchsuche

Why Do I Get `IllegalMonitorStateException` When Using `wait()` in Java?

Java Wait and Notify: IllegalMonitorStateException verstehen

In der Multithread-Programmierung ermöglichen die Methoden wait() und notify() Threads, ihre Aktionen zu koordinieren. Die falsche Verwendung dieser Methoden kann jedoch zu einer IllegalMonitorStateException führen.

Im angegebenen Codeausschnitt versuchen Sie innerhalb der Klasse Main, wait() für Main.main aufzurufen. Es tritt jedoch eine IllegalMonitorStateException auf. Dies liegt daran, dass der aktuelle Thread (Hauptthread) die Sperre für das Main.main-Objekt nicht hält.

Um dieses Problem zu beheben, müssen Sie den Codeblock synchronisieren, in dem wait() aufgerufen wird. Dies kann erreicht werden, indem ein synchronisierter(...)-Block für das Objekt verwendet wird, auf das Sie warten möchten. In diesem Fall handelt es sich um das Main.main-Objekt:

<code class="java">public void run() {
    try {
        synchronized (Main.main) {
            Main.main.wait();
        }
    } catch (InterruptedException e) {}
    System.out.println("Runner away!");
}</code>

Durch die Synchronisierung auf dem Main.main-Objekt stellen Sie sicher, dass der aktuelle Thread (der Runner-Thread) die Sperre für das Objekt erhält, bevor er den Wartevorgang ausführt (). Wenn notifyAll() von der Hauptklasse aufgerufen wird, werden alle Runner-Threads benachrichtigt und können mit ihrer Ausführung fortfahren.

Das gleiche Prinzip gilt für die Methoden notify() und notifyAll(). Sie können nur von dem Thread aufgerufen werden, der die Sperre für das synchronisierte Objekt hält.

Das obige ist der detaillierte Inhalt vonWarum erhalte ich „IllegalMonitorStateException“, wenn ich „wait()“ in Java 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