1350 Stimmen

Unterschied zwischen "wait()" vs "sleep()" in Java

Was ist der Unterschied zwischen einem wait() und sleep() in Threads?

Ist mein Verständnis richtig, dass ein wait()-ender Thread sich immer noch im Laufmodus befindet und CPU-Zyklen verwendet, während ein sleep()-ender Thread keine CPU-Zyklen verbraucht?

Warum haben wir beide wait() und sleep()?

Wie unterscheidet sich deren Implementierung auf niedrigerer Ebene?

61 Stimmen

Sehr gute Frage. Die Semantik beider ist leicht zu verwechseln.

1 Stimmen

Sehr gute Fragen, aber sie sind 2 in einem. Warum wir beide haben, ist nicht dasselbe wie wie sie auf einer niedrigeren Ebene implementiert werden können (und nicht sind!). Darauf habe ich auch geantwortet.

0 Stimmen

Angenommen ein Thread A befindet sich in einem synchronisierten Block, und während er in der CPU ist, wird dieser Thread einem anderen Thread B übergeben. In welchem Zustand wird Thread A jetzt sein? Werden die anderen Threads, die auf diesem synchronisierten Block warten, jetzt eintreten?

1voto

Ravindra babu Punkte 45577

Von der Oracle-Dokumentationsseite zur wait()-Methode der Object:

public final void wait()
  1. Veranlasst den aktuellen Thread zu warten, bis ein anderer Thread die Methode notify() oder die Methode notifyAll() für dieses Objekt aufruft. Mit anderen Worten, diese Methode verhält sich genau so, als würde sie den Aufruf wait(0) durchführen.
  2. Der aktuelle Thread muss im Besitz des Monitors dieses Objekts sein. Der Thread gibt den Besitz dieses Monitors frei und wartet, bis ein anderer Thread Threads, die auf den Monitor dieses Objekts warten, benachrichtigt, aufzuwachen.
  3. Unterbrechungen und falsche Weckrufe sind möglich.
  4. Diese Methode sollte nur von einem Thread aufgerufen werden, der im Besitz des Monitors dieses Objekts ist.

Diese Methode wirft:

  1. IllegalMonitorStateException - wenn der aktuelle Thread nicht im Besitz des Monitors des Objekts ist.

  2. InterruptedException - wenn ein Thread den aktuellen Thread unterbrochen hat, bevor oder während der aktuelle Thread auf eine Benachrichtigung wartete. Der unterbrochene Status des aktuellen Threads wird gelöscht, wenn diese Ausnahme geworfen wird.

Von der Oracle-Dokumentationsseite zur sleep()-Methode der Thread-Klasse:

public static void sleep(long millis)
  1. Veranlasst den aktuell ausgeführten Thread, für die angegebene Anzahl von Millisekunden zu schlafen (vorübergehend die Ausführung einzustellen), abhängig von der Präzision und Genauigkeit der Systemtimer und Scheduler.
  2. Der Thread verliert nicht den Besitz von Monitoren.

Diese Methode wirft:

  1. IllegalArgumentException - wenn der Wert von millis negativ ist.

  2. InterruptedException - wenn ein Thread den aktuellen Thread unterbrochen hat. Der unterbrochene Status des aktuellen Threads wird gelöscht, wenn diese Ausnahme geworfen wird.

Weiterer wesentlicher Unterschied:

wait() ist eine nicht-statische Methode (Instanzmethode) im Gegensatz zur statischen Methode sleep() (Klassenmethode).

0voto

pavan Punkte 33

Angenommen, Sie hören gerade Lieder.

Solange das aktuelle Lied läuft, wird das nächste Lied nicht abgespielt, d.h. Sleep() wird vom nächsten Lied aufgerufen.

Wenn Sie das Lied beenden, wird es gestoppt und bis Sie die Wiedergabetaste auswählen (notify()), wird es nicht abgespielt, d.h. Wait() wird vom aktuellen Lied aufgerufen.

In beiden Fällen gehen die Lieder in den Wartezustand.

0voto

LiLi Punkte 343

Wait() muss mit synchronized umgeben werden, wenn der Thread den synchronisierten Block oder die Methode betritt, was bedeutet, dass er die Sperre erhält, so dass es nicht blockiert, und das Aufrufen von wait bedeutet, dass die Sperre freigegeben wird, so dass der synchronisierte Block verlassen wird. Thread.sleep() bewirkt, dass der aktuelle Thread die Ausführung für einen bestimmten Zeitraum unterbricht. Der Thread verliert nicht die Eigentümerschaft an Monitoren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X