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?

2voto

AVI Punkte 5346

Sollte aus synchronisiertem Block aufgerufen werden : Die wait()-Methode wird immer aus einem synchronisierten Block aufgerufen, d.h. die wait()-Methode muss den Objektmonitor sperren, bevor sie auf dem Objekt aufgerufen wird. Aber die sleep()-Methode kann von außerhalb des synchronisierten Blocks aufgerufen werden, d.h. die sleep()-Methode benötigt keinen Objektmonitor.

IllegalMonitorStateException : Wenn die wait()-Methode aufgerufen wird, ohne den Objektschloss zu erwerben, wird zur Laufzeit eine IllegalMonitorStateException ausgelöst, aber die sleep()-Methode wirft nie eine solche Ausnahme.

Gehört zu welcher Klasse : Die wait()-Methode gehört zur Klasse java.lang.Object, aber die sleep()-Methode gehört zur Klasse java.lang.Thread.

Auf Objekt oder Thread aufgerufen : Die wait()-Methode wird auf Objekten aufgerufen, aber die sleep()-Methode wird auf Threads und nicht auf Objekten aufgerufen.

Thread-Zustand : Wenn die wait()-Methode auf einem Objekt aufgerufen wird, geht der Thread, der den Objektmonitor gehalten hat, vom Laufzustand in den Wartezustand über und kann nur in den ausführbaren Zustand zurückkehren, wenn die notify()- oder notifyAll()-Methode auf dem Objekt aufgerufen wird. Später plant der Thread-Scheduler diesen Thread, vom ausführbaren Zustand in den Laufzustand zu wechseln. Wenn die sleep()-Methode auf einem Thread aufgerufen wird, geht dieser vom Laufzustand in den Wartezustand über und kann in den ausführbaren Zustand zurückkehren, wenn die Schlafzeit abgelaufen ist.

Wenn aus synchronisiertem Block aufgerufen : Wenn die wait()-Methode aufgerufen wird, verlässt der Thread das Objektschloss. Aber die sleep()-Methode, wenn sie aus einem synchronisierten Block oder einer synchronisierten Methode aufgerufen wird, verlässt das Objektschloss nicht.

Weitere Informationen hier

0 Stimmen

Wahrscheinlich eine bessere Referenz-URL als diese.

1voto

TT_ Punkte 1599

Eigentlich ist all dies klar in den Java-Dokumentationen beschrieben (aber das habe ich erst nach dem Lesen der Antworten realisiert).

http://docs.oracle.com/javase/8/docs/api/index.html :

wait() - Der aktuelle Thread muss den Monitor dieses Objekts besitzen. Der Thread gibt den Besitz dieses Monitors frei und wartet, bis ein anderer Thread Threads, die auf den Monitor dieses Objekts warten, durch einen Aufruf der notify-Methode oder der notifyAll-Methode aufzuwecken. Der Thread wartet dann, bis er den Besitz des Monitors wiedererlangen kann und setzt die Ausführung fort.

sleep() - Verursacht, dass der aktuell ausgeführte Thread für die angegebene Anzahl von Millisekunden schlafen geht (die Ausführung vorübergehend unterbricht), abhängig von der Genauigkeit und Präzision der Systemtimer und Scheduler. Der Thread verliert den Besitz von Monitoren nicht.

1voto

Rupesh Punkte 2547
  • Die Methode wait(1000) lässt den aktuellen Thread bis zu einer Sekunde schlafen.
    • Ein Thread könnte weniger als 1 Sekunde schlafen, wenn er den Methodenaufruf notify() oder notifyAll() erhält.
  • Der Aufruf von sleep(1000) lässt den aktuellen Thread für genau 1 Sekunde schlafen.
    • Auch ein schlafender Thread hält keine Sperre für Ressourcen. Aber wartende Threads tun dies.

2 Stimmen

sleep(1000) garantiert nicht, genau 1 Sekunde zu schlafen. Es kann vorher unterbrochen werden.

1 Stimmen

Diese Beiträge sind so verwirrend. Alle anderen Beiträge in diesem Thread sagen, dass ein schlafender Thread das Schloss hält und dass ein wartender Thread das Schloss nicht hält. Ebenso impliziert der Beitrag mit dem Diagramm, dass Aufrufe von notify() schlafende Threads aufwecken, aber andere Beiträge (und Thread-Zustandsdiagramme) legen nahe, dass nur interrupt() oder das Ablaufen der Timeout-Periode dies tun. Ich habe mir gerade ein Exemplar von "Java Concurrency in Practice" bestellt, etwas, das ich schon lange hätte lesen sollen!

0 Stimmen

Wenn Thread.sleep() innerhalb eines synchronisierten Blocks aufgerufen wird, HÄLT ES DEN SCHLOSS weiterhin für die Dauer des Schlafes und verhindert, dass andere Threads denselben synchronisierten Block betreten!!! Diese Antwort enthält eine falsche Aussage über das Schloss.

1voto

Dr. Debasish Jana Punkte 6845

wait() mit einem Timeout-Wert kann aufwachen, wenn der Timeout-Wert abgelaufen ist oder benachrichtigt wird, je nachdem, was zuerst eintritt (oder auch unterbrochen wird), während ein sleep() aufwacht, wenn der Timeout-Wert abgelaufen ist oder unterbrochen wird, je nachdem, was zuerst eintritt. wait() ohne Timeout-Wert wird für immer warten, bis benachrichtigt oder unterbrochen wird.

1voto

Aravind Mano Punkte 19

wait() wird in einer synchronisierten Methode ausgeführt, während sleep() in einer nicht synchronisierten Methode ausgeführt wird, weil die wait()-Methode das Schloss des Objekts freigibt, aber sleep() oder yield() das lock() nicht freigibt.

0 Stimmen

sleep() kann innerhalb eines synchronized-Blocks oder einer Methode sein. Antwort erklärt nichts.

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