Java.Lang.IllegalMonitorStateException
Die IllegalMonitorStateException
hängt mit der Multithreading-Programmierung zusammen. Dieses Tutorial beschreibt und demonstriert die IllegalMonitorStateException
in Java.
die java.lang.IllegalMonitorStateException
in Java
Die IllegalMonitorStateException
tritt beim Arbeiten mit Multithreading-Programmierung in Java auf. Wenn wir auf einem Monitor synchronisieren und ein Thread versucht zu warten oder die anderen Threads zu benachrichtigen, die auf dem Monitor warten, ohne ihn zu dieser Zeit zu besitzen, tritt die IllegalMonitorStateException
auf.
Wenn wir die Methoden wait()
, notify()
oder notifyAll()
aus der object
-Klasse aufrufen, die sich nicht im synchronized
-Block befindet, wird diese Ausnahme ausgelöst. Lassen Sie uns ein Beispiel in diesem Szenario versuchen.
package delftstack;
class DemoClass implements Runnable {
public void run() {
try {
// The wait method is called outside the synchronized block
this.wait(100);
System.out.println("Thread can successfully run.");
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
public class Example {
public static void main(String[] args) {
DemoClass DemoRunnable = new DemoClass();
Thread DemoThread = new Thread(DemoRunnable);
DemoThread.start();
}
}
Der obige Code erstellt eine Klasse, die die Klasse Runnable
implementiert und dann die Methode wait
ausserhalb des Blocks synchronized
aufruft. Das Example
erstellt einen Thread aus der Instanz von DemoClass
.
Es löst die IllegalMonitorStateException
aus, weil die wait
-Methode ausserhalb des synchronized
-Blocks aufgerufen wird und der Thread eine Sperre auf dem Monitor besitzen muss, bevor wir die wait()
-Methode aufrufen. Siehe Ausgabe:
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException: current thread is not owner
at java.base/java.lang.Object.wait(Native Method)
at delftstack.DemoClass.run(Example.java:7)
at java.base/java.lang.Thread.run(Thread.java:833)
Um diese Ausnahme zu beheben, müssen wir die Methoden wait()
, notify()
oder notifyAll()
aufrufen, nachdem die object
-Sperre erworben wurde, die sich im synchronized
-Block befindet.
Lassen Sie uns nun die Methode wait()
in den Block synchronized
einfügen und den obigen Code fehlerfrei machen. Siehe Beispiel:
package delftstack;
class DemoClass implements Runnable {
public void run() {
synchronized (this) {
try {
// The wait method is called outside the synchronized block
this.wait(100);
System.out.println("Thread can successfully run.");
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
}
public class Example {
public static void main(String[] args) {
DemoClass DemoRunnable = new DemoClass();
Thread DemoThread = new Thread(DemoRunnable);
DemoThread.start();
}
}
Jetzt befindet sich die wait()
-Methode innerhalb des synchronized
-Blocks und die Sperre auf dem Objektmonitor wird erworben, der Code wird erfolgreich ausgeführt. Siehe Ausgabe:
Thread can successfully run.
Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.
LinkedIn FacebookVerwandter Artikel - Java Exception
- Ausnahme bei ungültiger Eingabe in Java
- Ausnahme im Hauptthread Java.Util.NoSuchElementException: Keine Zeile gefunden
- Ausnahme im Thread AWT-EventQueue-0 java.lang.NullPointerException
- Beheben Sie die Java.Net.BindException: Adresse wird bereits verwendet: Bind
- Der Java-Gateway-Prozess wurde beendet, bevor seine Portnummer gesendet wurde
- Java Throwable vs. Ausnahmeklasse