Java-Object-notify()-Methode
Java Object-Klasse
Die Methode notify() der Klasse Object wird verwendet, um einen Thread aufzuwecken, der auf dem Monitor dieses Objekts wartet.
Wenn alle Threads auf dieses Objekt warten, wird nur ein Thread ausgewählt. Die Auswahl ist willkürlich und erfolgt, wenn die Implementierung eine Entscheidung trifft.
Ein Thread kann die Methode wait() aufrufen, um auf den Monitor eines Objekts zu warten.
Die Methode notify() kann nur von einem Thread aufgerufen werden, der Eigentümer des Monitors dieses Objekts ist.
Damit ein Thread Eigentümer des Monitors eines Objekts werden kann, kann er die folgenden 3 Methoden verwenden:
- Ausführen einer synchronisierten Instanzmethode des Objekts
- Verwenden der integrierten synchronized-Sperre
- Bei Objekten vom Typ Class: Ausführen einer synchronisierten statischen Methode
Nur ein Thread kann den Monitor eines Objekts gleichzeitig besitzen.
Wenn der aktuelle Thread nicht der Eigentümer des Monitors dieses Objekts ist, wird erIllegalMonitorStateExceptioneine Ausnahme auslösen.
Syntax
public final void notify()
Parameters
Rückgabewert
Kein Rückgabewert.
Beispiel
Das folgende Beispiel veranschaulicht die Verwendung der Methode notify():
Beispiel
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class ExampleTest {
private List synchedList;
public ExampleTest() {
synchedList = Collections.synchronizedList(new LinkedList());
}
public String removeElement() throws InterruptedException {
synchronized (synchedList) {
while (synchedList.isEmpty()) {
System.out.println("Liste ist leer...");
synchedList.wait();
System.out.println("Warte...");
}
String element = (String) synchedList.remove(0);
return element;
}
}
public void addElement(String element) {
System.out.println("Öffnen...");
synchronized (synchedList) {
synchedList.add(element);
System.out.println("Neues Element:'" + element + "'");
synchedList.notifyAll();
System.out.println("notifyAll aufgerufen!");
}
System.out.println("Schließen...");
}
public static void main(String[] args) {
final ExampleTest demo = new ExampleTest();
Runnable runA = new Runnable() {
public void run() {
try {
String item = demo.removeElement();
System.out.println("" + item);
} catch (InterruptedException ix) {
System.out.println("Unterbrochene Ausnahme!");
} catch (Exception x) {
System.out.println("Ausnahme ausgelöst.");
}
}
};
Runnable runB = new Runnable() {
public void run() {
demo.addElement("Hallo!");
}
};
try {
Thread threadA1 = new Thread(runA, "Google");
threadA1.start();
Thread.sleep(500);
Thread threadA2 = new Thread(runA, "Example");
threadA2.start();
Thread.sleep(500);
Thread threadB = new Thread(runB, "Taobao");
threadB.start();
Thread.sleep(1000);
threadA1.interrupt();
threadA2.interrupt();
} catch (InterruptedException x) {
}
}
}
Die Ausgabe des obigen Programms ist:
List is empty...
List is empty...
Opening...
New Element:'Hello!'
notifyAll called!
Closing...
Waiting...
Waiting...
List is empty...
Hello!
Interrupted Exception!
Java Object-Klasse
Andere Erweiterungen