Java-Object-notify()-Methode

Java String类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

  • Keine 。

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() { //Erstelle eine synchronisierte Liste synchedList = Collections.synchronizedList(new LinkedList()); } //Entferne ein Element aus der Liste public String removeElement() throws InterruptedException { synchronized (synchedList) { //Warte, wenn die Liste leer ist while (synchedList.isEmpty()) { System.out.println("Liste ist leer..."); synchedList.wait(); System.out.println("Warte..."); } String element = (String) synchedList.remove(0); return element; } } //Füge ein Element zur Liste hinzu public void addElement(String element) { System.out.println("Öffnen..."); synchronized (synchedList) { //Ein Element hinzufügen und benachrichtigen, dass das Element vorhanden ist 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() { //Führe die Operation zum Hinzufügen des Elements aus und starte die Schleife 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 String类Java Object-Klasse

Andere Erweiterungen