Java Object wait(long timeout, int nanos) Methode

Java String类Java Object-Klasse


Die Methode Object wait(long timeout, int nanos) versetzt den aktuellen Thread in einen wartenden (blockierten) Zustand, bis ein anderer Thread die notify()-Methode oder die notifyAll()-Methode dieses Objekts aufruft oder bis der durch die Parameter timeout und nanos festgelegte Timeout-Zeitraum überschritten wird.

Diese Methode ähnelt derwait(long timeout)-Methode,hat jedoch einen zusätzlichen nanos-Parameter, der zusätzliche Zeit darstellt (in Nanosekunden, Bereich 0-999999). Zum Timeout-Zeitraum müssen also noch nanos Nanosekunden hinzugefügt werden.

Wenn sowohl die Parameter timeout als auch nanos 0 sind, gibt es kein Timeout und es wartet unbegrenzt, ähnlich derwait()-Methode。

Der aktuelle Thread muss der Monitor-Eigentümer dieses Objekts sein, andernfalls tritt weiterhin eineIllegalMonitorStateException-Ausnahme auf.

Wenn der aktuelle Thread von einem beliebigen Thread vor oder während des Wartens unterbrochen wird, wird eineInterruptedException-Ausnahme ausgelöst.

Wenn die übergebenen Parameter ungültig sind oder nanos nicht im Bereich 0-999999 liegt, wird eineIllegalArgumentException-Ausnahme ausgelöst.

Syntax

public final void wait(long timeout, int nanos)

Parameters

  • timeout- Die Wartezeit (in Millisekunden).

  • nanos- Die zusätzliche Wartezeit (in Nanosekunden).

Rückgabewert

Kein Rückgabewert.

Beispiel

Das folgende Beispiel demonstriert die Verwendung der Methode wait(long timeout, int nanos):

Beispiel

import java.util.Collections; import java.util.LinkedList; import java.util.List; public class ExampleTest extends Object { private List synchedList; public ExampleTest() { //Synchronisierte Liste erstellen synchedList = Collections.synchronizedList(new LinkedList()); } //Elemente aus der Liste löschen public String removeElement() throws InterruptedException { synchronized (synchedList) { //Wenn die Liste leer ist, warte 10 Sekunden plus 500 Nanosekunden while (synchedList.isEmpty()) { System.out.println("Liste ist leer..."); synchedList.wait(10000, 500); System.out.println("Warten..."); } String element = (String) synchedList.remove(0); return element; } } //Elemente zur Liste hinzufügen public void addElement(String element) { System.out.println("Öffnen..."); synchronized (synchedList) { //Ein Element hinzufügen und benachrichtigen, dass das Element existiert 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) { } } }

Das Ausführungsergebnis 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