Die Methoden wait, notify und notifyAll sind die letzten nativen Methoden der Object-Klasse. Daher können diese Methoden nicht von Unterklassen überschrieben werden. Die Object-Klasse ist die Oberklasse aller Klassen, daher gibt es die folgenden drei Formen des Aufrufs von Wait- und anderen Methoden im Programm.
Kopieren Sie den Codecode wie folgt:
wait();//Methode 1:
this.wait();//Methode 2:
super.wait();//Methode 3
void notifyAll()
Entsperrt alle Threads, die die Wartemethode für dieses Objekt aufrufen. Diese Methode kann nur innerhalb einer synchronisierten Methode oder eines synchronisierten Blocks aufgerufen werden. Wenn der aktuelle Thread nicht der Sperreninhaber ist, löst diese Methode eine IllegalMonitorStateException aus.
void notify()
Wählen Sie zufällig einen Thread aus, der die Wartemethode für das Objekt aufruft, um die Blockierung aufzuheben. Diese Methode kann nur innerhalb einer synchronisierten Methode oder eines synchronisierten Blocks aufgerufen werden. Wenn der aktuelle Thread nicht der Sperreninhaber ist, löst diese Methode eine IllegalMonitorStateException aus.
void warte()
Bewirkt, dass der Thread in einen Wartezustand wechselt, bis er von anderen Threads über notify() oder notifyAll geweckt wird. Diese Methode kann nur innerhalb einer synchronisierten Methode aufgerufen werden. Wenn der aktuelle Thread nicht der Sperreninhaber ist, löst diese Methode eine IllegalMonitorStateException aus.
void wait(long millis) und void wait(long millis,int nanos)
Bewirkt, dass der Thread in einen Wartezustand wechselt, bis er benachrichtigt wird oder die angegebene Zeit abläuft. Diese Methoden können nur innerhalb synchronisierter Methoden aufgerufen werden. Wenn der aktuelle Thread nicht der Sperreninhaber ist, löst diese Methode eine IllegalMonitorStateException aus.
Object.wait(), Object.notify() und Object.notifyall() müssen innerhalb der synchronisierten Methode oder innerhalb des synchronisierten Blocks geschrieben werden. Dies liegt daran, dass diese Methoden erfordern, dass der Thread, der aktuell die Methode object.wait() ausführt, die besitzt Objekt. Objektsperre. Selbst wenn Sie sicher wissen, dass der aktuelle Kontextthread die Objektsperre besitzt, können Sie im aktuellen Kontext keine Anweisungen wie object.wait() schreiben. wie:
Kopieren Sie den Codecode wie folgt:
Paket edu.sjtu.erplab.ObjectTest;
Klasse A
{
public synchronisiert void printThreadInfo() löst eine InterruptedException aus
{
Thread t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}
öffentliche Klasse ObjectWaitTest {
public static void main(String args[])
{
A a=neues A();
//Da die printThreadInfo()-Methode eine InterruptedException auslöst, muss hier ein Try-Catch-Block verwendet werden.
versuchen {
a.printThreadInfo();
erwarten();
} Catch (InterruptedException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
}
}
Beim Ausführen des Programms wird ein Fehler gemeldet. Die Ergebnisse lauten wie folgt:
ThreadID:1, ThreadName:main
Ausnahme im Thread „main“ java.lang.IllegalMonitorStateException
bei java.lang.Object.wait(Native Methode)
bei java.lang.Object.wait(Object.java:485)
bei edu.sjtu.erplab.ObjectTest.ObjectWaitTest.main(ObjectWaitTest.java:24)
Die richtige Art, es zu schreiben, sollte sein
Kopieren Sie den Codecode wie folgt:
Paket edu.sjtu.erplab.ObjectTest;
Klasse A
{
public synchronisiert void printThreadInfo() löst eine InterruptedException aus
{
Thread t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
// this.wait(); //Warten Sie weiter
this.wait(1000);//Warten Sie 1000 ms
// super.wait(1000);
}
}
öffentliche Klasse ObjectWaitTest {
public static void main(String args[])
{
A a=neues A();
//Da die printThreadInfo()-Methode eine InterruptedException auslöst, muss hier ein Try-Catch-Block verwendet werden.
versuchen {
a.printThreadInfo();
//erwarten();
} Catch (InterruptedException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
Thread t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}