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?

15voto

pvllnspk Punkte 5429

sleep ist eine Methode von Thread, wait ist eine Methode von Object, also ist wait/notify eine Technik zur Synchronisierung von gemeinsamen Daten in Java (unter Verwendung eines Monitors), jedoch ist sleep eine einfache Methode des Threads, um sich selbst zu pausieren.

0 Stimmen

Einfache Antwort, um das Konzept zu verstehen. Vielen Dank

10voto

Reegan Miranda Punkte 2741

sleep() ist eine Methode, die verwendet wird, um den Prozess für einige Sekunden oder für die gewünschte Zeit zu halten, aber im Falle der wait() Methode geht der Thread in den Wartezustand und kommt nicht automatisch zurück, bis wir notify() oder notifyAll() aufrufen.

Der Hauptunterschied besteht darin, dass wait() den Lock oder Monitor freigibt, während sleep() keinen Lock oder Monitor freigibt. Wait wird für die Kommunikation zwischen Threads verwendet, während sleep im Allgemeinen verwendet wird, um eine Pause in der Ausführung einzuführen.

Thread.sleep() versetzt den aktuellen Thread für eine bestimmte Zeitdauer in den Zustand "Not Runnable". Der Thread behält die Monitore, die er erworben hat - d.h. wenn der Thread sich gerade in einem synchronisierten Block oder Methode befindet, kann kein anderer Thread diesen Block oder diese Methode betreten. Wenn ein anderer Thread t.interrupt() aufruft, wird der schlafende Thread aufgeweckt. Beachten Sie, dass sleep eine statische Methode ist, was bedeutet, dass sie immer den aktuellen Thread betrifft (den, der die sleep Methode ausführt). Ein häufiger Fehler ist es, t.sleep() aufzurufen, wobei t ein anderer Thread ist; selbst dann ist es der aktuelle Thread, der schläft, nicht der t-Thread.

object.wait() versetzt den aktuellen Thread - wie sleep() - in den Zustand "Not Runnable", aber mit einem Unterschied. Wait wird auf ein Objekt, nicht auf einen Thread, aufgerufen; wir nennen dieses Objekt das "Sperrobjekt". Bevor lock.wait() aufgerufen wird, muss der aktuelle Thread auf dem Sperrobjekt synchronisiert werden; wait() gibt dann dieses Schloss frei und fügt den Thread der "Warteliste" bei, die mit dem Schloss verknüpft ist. Später kann ein anderer Thread auf demselben Sperrobjekt synchronisieren und lock.notify() aufrufen. Dadurch wird der ursprüngliche wartende Thread aufgeweckt. Grundsätzlich ist wait()/notify() wie sleep()/interrupt(), nur dass der aktive Thread keinen direkten Zeiger auf den schlafenden Thread benötigt, sondern nur auf das gemeinsam genutzte Sperrobjekt.

synchronized(LOCK) {   
   Thread.sleep(1000); // LOCK ist gehalten
}

synchronized(LOCK) {  
   LOCK.wait(); // LOCK ist nicht gehalten
}

Lassen Sie uns alle oben genannten Punkte kategorisieren:

Aufruf auf:

  • wait(): Aufruf auf einem Objekt; der aktuelle Thread muss auf dem Sperrobjekt synchronisieren.
  • sleep(): Aufruf auf einem Thread; immer der gerade ausgeführte Thread.

Synchronisiert:

  • wait(): wenn mehrere Threads synchronisiert auf dasselbe Objekt zugreifen.
  • sleep(): wenn mehrere Threads synchronisiert auf das Ende des schlafenden Threads warten.

Schloss halten:

  • wait(): gibt das Schloss frei, damit andere Objekte die Möglichkeit haben auszuführen.
  • sleep(): behält das Schloss für mindestens t Zeit, wenn ein Timeout festgelegt ist oder jemand unterbricht.

Aufwachbedingung:

  • wait(): bis notify() oder notifyAll() von Objekt aufgerufen wird.
  • sleep(): bis mindestens die Zeit abgelaufen ist oder interrupt() aufgerufen wird.

Verwendung:

  • sleep(): für Zeit-Synchronisation und;
  • wait(): für Multi-Thread-Synchronisation.

Ref:Unterschied sleep und wait

7voto

Ratnesh Maurya Punkte 696

In einfachen Worten, warten ist warten, bis ein anderer Thread dich aufruft, während sleep "führe die nächste Anweisung nicht aus" für eine bestimmte Zeitperiode ist.

Außerdem ist sleep eine statische Methode in der Thread-Klasse und wirkt auf den Thread, während wait() in der Object-Klasse ist und auf ein Objekt aufgerufen wird.

Noch ein Punkt, wenn du auf ein Objekt wartest, synchronisiert der beteiligte Thread das Objekt und wartet dann. :)

1 Stimmen

Warum benötigen Sie beides? Warum ist sleep() nicht ausreichend?

2 Stimmen

Notify wird zur Kommunikation zwischen Threads verwendet. Um wait aufzurufen, benötigen Sie ein Objekt, auf das synchronisiert wird, und rufen dann wait darauf auf. Um benachrichtigt zu werden, benötigen Sie einen anderen Thread, der auf dasselbe Objekt synchronisiert ist und notify aufruft.

6voto

Roee Adler Punkte 32367

wait und sleep Methoden sind sehr unterschiedlich:

  • sleep hat keine Möglichkeit, "aufzuwachen",
  • während wait eine Möglichkeit hat, während der Wartezeit "aufzuwachen", indem ein anderer Thread notify oder notifyAll aufruft.

Wenn man darüber nachdenkt, sind die Namen in dieser Hinsicht verwirrend; jedoch ist sleep ein Standardname und wait ähnelt dem WaitForSingleObject oder WaitForMultipleObjects in der Win-API.

3 Stimmen

Aber wir können einen Schlaf unterbrechen, oder? Was ist also der Unterschied zwischen diesem Schlaf/Unterbrechen und Warten/Benachrichtigen?

3 Stimmen

Sie können eine schlafende Person unterbrechen, aber nur eine wartende Person benachrichtigen. Threads sind gleich.

5voto

user2485429 Punkte 567

Von diesem Beitrag: http://javaconceptoftheday.com/difference-between-wait-and-sleep-methods-in-java/

Methode wait()

1) Der Thread, der die wait() Methode aufruft, gibt das von ihm gehaltene Schloss frei.

2) Der Thread erhält das Schloss zurück, nachdem andere Threads entweder die notify() oder notifyAll() Methoden auf dem gleichen Schloss aufgerufen haben.

3) Die wait() Methode muss innerhalb des synchronized Blocks aufgerufen werden.

4) Die wait() Methode wird immer auf Objekten aufgerufen.

5) Wartende Threads können von anderen Threads geweckt werden, indem diese die notify() oder notifyAll() Methoden aufrufen.

6) Um die wait() Methode aufzurufen, muss der Thread das Objektschloss haben.

Methode sleep()

1) Der Thread, der die sleep() Methode aufruft, gibt das von ihm gehaltene Schloss nicht frei.

2) Die sleep() Methode kann innerhalb oder außerhalb des synchronized Blocks aufgerufen werden.

3) Die sleep() Methode wird immer auf Threads aufgerufen.

4) Schlafende Threads können nicht von anderen Threads geweckt werden. Wenn dies geschieht, wirft der Thread eine InterruptedException.

5) Um die sleep() Methode aufzurufen, muss der Thread kein Objektschloss haben.

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