Frage Unterschied zwischen wait () und sleep ()


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

Ist mein Verständnis das a wait()-ing Thread befindet sich noch im laufenden Modus und verwendet CPU-Zyklen, aber a sleep()-ing verbraucht keine CPU-Zyklen richtig?

Warum haben wir? beide  wait() und sleep(): Wie variiert ihre Implementierung auf einer niedrigeren Ebene?


1026
2018-06-24 06:48


Ursprung


Antworten:


EIN wait kann von einem anderen Thread "aufgeweckt" werden notify auf dem Monitor, auf den gewartet wird, während a sleep kann nicht. Auch ein wait (und notify) muss in einem Block passieren synchronized auf dem Monitorobjekt während sleep nicht:

Object mon = ...;
synchronized (mon) {
    mon.wait();
} 

An dieser Stelle wartet der aktuell laufende Thread und gibt den Monitor frei. Ein anderer Thread kann das tun

synchronized (mon) { mon.notify(); }

(Auf demselben mon Objekt) und der erste Thread (vorausgesetzt, es ist der einzige Thread, der auf dem Monitor wartet) wird aufwachen.

Sie können auch anrufen notifyAll Wenn mehr als ein Thread auf dem Monitor wartet, wird dies aktiviert alle von ihnen. Allerdings kann nur einer der Threads den Monitor erfassen (denken Sie daran, dass der wait ist in einem synchronized blockieren) und weitermachen - die anderen werden dann blockiert, bis sie die Sperre des Monitors erhalten können.

Ein weiterer Punkt ist, dass Sie anrufen wait auf Object selbst (d. h. Sie warten auf dem Monitor eines Objekts), während Sie anrufen sleep auf Thread.

Noch ein weiterer Punkt ist, dass Sie bekommen können falsche wakeups von wait (d. h. der Thread, der wartet, wird ohne ersichtlichen Grund fortgesetzt). Du solltest immer wait während des Drehens unter bestimmten Bedingungen wie folgt:

synchronized {
    while (!condition) { mon.wait(); }
}

739
2018-06-24 06:50



Ein Hauptunterschied, der noch nicht erwähnt wurde, ist, dass während das Schlafen ein Thread tut nicht Lösen Sie die Sperren, die es enthält, und warten Sie, während Sie auf das Objekt warten wait() ist angerufen.

synchronized(LOCK) {
    Thread.sleep(1000); // LOCK is held
}


synchronized(LOCK) {
    LOCK.wait(); // LOCK is not held
}

285
2018-06-24 07:06



ich fand dieser Link hilfreich (welche Referenzen dieser Beitrag). Es macht den Unterschied zwischen sleep(), wait(), und yield() in menschlicher Hinsicht. (für den Fall, dass die Links jemals tot sind, habe ich den Post unten mit zusätzlichen Markup eingefügt)

Es geht schließlich zum OS-Scheduler, der   teilt Timeslices zu Prozessen und Threads aus.

sleep(n) sagt "Ich bin fertig mit meinem Zeitfenster und bitte gib mir nicht   ein anderes für mindestens n Millisekunden. " Das Betriebssystem versucht es nicht einmal   Planen Sie den schlafenden Thread ein, bis die angeforderte Zeit verstrichen ist.

yield() sagt "Ich bin fertig mit meinem Zeitfenster, aber ich habe noch Arbeit   machen." Dem Betriebssystem steht es frei, dem Thread sofort ein anderes Zeitfenster zu geben,   oder um einen anderen Thread zu geben oder die CPU den ergebenden Thread zu verarbeiten   gab einfach auf.

.wait() sagt "Ich bin fertig mit meinem Zeitfenster. Gib mir kein anderes   timeSlice, bis jemand notify () anruft. " Wie mit sleep()das OS wird nicht   Versuchen Sie sogar, Ihre Aufgabe zu planen, wenn nicht jemand anruft notify() (oder einer von   ein paar andere Aufweckszenarien treten auf).

Threads verlieren auch den Rest ihres Zeitfensters, wenn sie spielen   Blockierung IO und unter einigen anderen Umständen. Wenn ein Thread funktioniert   Durch das gesamte Zeitfenster übernimmt das Betriebssystem gewaltsam die Kontrolle   ob yield()wurde aufgerufen, damit andere Prozesse laufen können.

Du brauchst es selten yield(), aber wenn Sie eine rechenintensive App mit haben   logische Aufgabengrenzen, Einfügen eines yield()  Macht System verbessern   Reaktionsfähigkeit (auf Kosten der Zeit - Kontextwechsel, gerade eben   zum OS und zurück, sind nicht frei). Messen und testen Sie gegen Ihre Ziele   kümmern sich um, wie immer.


198
2017-08-05 19:32



Es gibt viele Antworten hier, aber ich konnte die semantische Unterscheidung nicht finden, die auf irgendwelchen erwähnt wird.

Es geht nicht um den Thread selbst; Beide Methoden sind erforderlich, da sie sehr unterschiedliche Anwendungsfälle unterstützen.

sleep() sendet den Thread in den Ruhezustand wie zuvor, packt den Kontext und beendet die Ausführung für eine vordefinierte Zeit. Um es rechtzeitig zu aktivieren, müssen Sie die Thread-Referenz kennen. Dies ist keine übliche Situation in einer Multithread-Umgebung. Es wird hauptsächlich für die Zeitsynchronisation (z. B. Wake in genau 3,5 Sekunden) und / oder hartcodierte Fairness verwendet (einfach nur eine Weile schlafen und andere Threads arbeiten lassen).

wait()Im Gegensatz dazu ist ein Thread- (oder Nachrichten-) Synchronisationsmechanismus, der es Ihnen ermöglicht, einen Thread zu benachrichtigen, von dem Sie keine gespeicherte Referenz haben (oder nicht beachten). Sie können es sich als ein Publish-Subscribe-Muster vorstellen (wait == Abonnieren und notify() == veröffentlichen). Im Grunde verwenden Sie notify () Sie senden eine Nachricht (die möglicherweise überhaupt nicht empfangen wird und normalerweise ist es Ihnen egal).

Zusammenfassend verwenden Sie normalerweise sleep() für die Zeitsynchronisation und wait() für die Multi-Thread-Synchronisation.

Sie könnten auf dieselbe Weise im zugrunde liegenden Betriebssystem implementiert werden oder gar nicht (da frühere Versionen von Java kein echtes Multithreading hatten; wahrscheinlich tun auch einige kleine VMs das nicht). Vergessen Sie nicht, dass Java auf einer VM ausgeführt wird. Daher wird Ihr Code je nach VM / OS / HW, auf dem er ausgeführt wird, in etwas anderes umgewandelt.


64
2018-04-19 10:38



Hier habe ich einige wichtige Unterschiede aufgeführt wait() und sleep() Methoden.
PS:  Klicken Sie auch auf die Links, um den Bibliothekscode zu sehen (internes Arbeiten, spielen Sie ein wenig herum, um besser zu verstehen). 

warten()

  1. wait() Methode gibt die Sperre frei.
  2. wait() ist die Methode von Object Klasse.
  3. wait() ist die nicht-statische Methode - public final void wait() throws InterruptedException { //...}
  4. wait() sollte benachrichtigt werden von notify() oder notifyAll() Methoden.
  5. wait() Methode muss aus einer Schleife aufgerufen werden, um mit einem Fehlalarm umzugehen.

  6. wait() Methode muss aus synchronisierten Kontext (d. h. synchronisierte Methode oder Block) aufgerufen werden, andernfalls wird es geworfen IllegalMonitorStateException

Schlaf()

  1. sleep() Methode gibt die Sperre nicht frei.
  2. sleep() ist die Methode von java.lang.Thread Klasse.
  3. sleep() ist die statische Methode - public static void sleep(long millis, int nanos) throws InterruptedException { //... }
  4. nach der angegebenen Zeit, sleep() abgeschlossen.
  5. sleep() besser nicht von loop zu rufen (d. h. Siehe Code unten).
  6. sleep() kann von überall her angerufen werden. Es gibt keine spezielle Anforderung.

Ref: Unterschied zwischen Warten und Schlafen

Code-Snippet für Aufruf der Warte- und Schlafmethode

synchronized(monitor){
    while(condition == true){ 
        monitor.wait()  //releases monitor lock
    }

    Thread.sleep(100); //puts current thread on Sleep    
}

thread transition to different thread states


43
2017-12-28 06:18



Es gibt einige wichtige Unterschiede, die ich nach der Arbeit an wait und sleep feststellen kann. Schauen Sie sich zunächst die Beispiele mit wait () und sleep () an:

Beispiel 1: benutzen warten() und Schlaf():

synchronized(HandObject) {
    while(isHandFree() == false) {
        /* Hand is still busy on happy coding or something else, please wait */
        HandObject.wait();
    }
}

/* Get lock ^^, It is my turn, take a cup beer now */
while (beerIsAvailable() == false) {
    /* Beer is still coming, not available, Hand still hold glass to get beer,
       don't release hand to perform other task */
    Thread.sleep(5000);
}

/* Enjoy my beer now ^^ */
drinkBeers();

/* I have drink enough, now hand can continue with other task: continue coding */
setHandFreeState(true);
synchronized(HandObject) {
    HandObject.notifyAll();
}

Lassen Sie Klarheit einige wichtige Hinweise:

  1. Ruf an:
    • wait (): Ruft den aktuellen Thread auf, der das HandObject-Objekt enthält
    • sleep (): Call on Thread Ausführungsaufgabe get bier (ist Klassenmethode also auf aktuell laufenden Thread wirken)
  2. Synchronisiert:
    • wait (): wenn synchronisierter Multi-Threads-Zugriff auf dasselbe Objekt (HandObject) (wenn Kommunikation zwischen mehr als einem Thread benötigt wird (Thread Code ausführen, Thread ausführen Bier holen) Zugriff auf dasselbe Objekt HandObject)
    • sleep (): in Wartezustand um fortzufahren auszuführen (Wartebier verfügbar)
  3. Sperre halten:
    • wait (): Löse die Sperre für das andere Objekt frei (HandObject ist kostenlos, du kannst andere Aufgaben ausführen)
    • sleep (): halte die Sperre mindestens t mal (oder bis zur Unterbrechung) (Mein Job wird immer noch nicht beendet, ich halte die Sperre weiterhin und warte auf eine Bedingung, um fortzufahren)
  4. Weckbedingung:
    • wait (): bis call notify (), notifyAll () vom Objekt
    • sleep (): bis mindestens die Zeit abläuft oder Interrupt aufrufen
  5. Und der letzte Punkt ist Verwenden Sie wann wie Estani zeigen:

Normalerweise verwenden Sie sleep () für die Zeitsynchronisierung und wait () für   Multi-Thread-Synchronisation.

Bitte korrigieren Sie mich, falls ich falsch liege.


28
2018-05-19 06:59



Unterschied zwischen wait () und sleep ()

  • Der grundlegende Unterschied ist wait() aus Object und sleep() ist eine statische Methode von Thread.

  • Der Hauptunterschied ist, dass wait() gibt die Sperre während sleep() gibt während des Wartens keine Sperre frei.

  • Das wait() wird während der Inter-Thread-Kommunikation verwendet sleep() wird verwendet, um im Allgemeinen eine Pause bei der Ausführung einzuführen.

  • Das wait() sollte von innen anrufen, synchronisieren oder sonst wir bekommen IllegalMonitorStateException  während sleep()  kann überall anrufen.

  • Um den Thread erneut zu starten wait()Du musst anrufen notify() oder notifyAll(). Während in sleep(), Der Thread wird nach dem angegebenen ms / sec-Intervall gestartet.

Gemeinsamkeiten, die helfen zu verstehen

  • Beides macht den aktuellen Thread in den Nicht ausführbar Zustand.
  • Beide sind native Methoden.

21
2017-07-24 06:48



Dies ist eine sehr einfache Frage, da beide Methoden eine völlig andere Verwendung haben.

Der Hauptunterschied besteht darin, zu warten, bis das Schloss oder der Monitor freigegeben wird, während der Schlafmodus während des Wartens keine Sperre oder Überwachung auslöst. Wait wird für die Inter-Thread-Kommunikation verwendet, während Sleep für die Ausführung der Pause verwendet wird. 

Dies war nur eine klare und grundlegende Erklärung, wenn Sie mehr als das wollen, dann lesen Sie weiter.

Im Falle von wait() methode thread geht in den wartestatus und es wird nicht automatisch zurückkommen, bis wir die notify() Methode (oder notifyAll() Wenn Sie mehr als einen Thread im Wartezustand haben und alle Threads aufwecken wollen). Und Sie benötigen eine Synchronisierung oder Objektsperre oder Klassensperre für den Zugriff auf wait() oder notify() oder notifyAll() Methoden. Und noch eine Sache, die wait() Diese Methode wird für die Kommunikation zwischen Threads verwendet, da ein Thread, der in den Wartestatus wechselt, einen anderen Thread benötigt, um diesen Thread zu aktivieren.

Aber im Falle von sleep() Dies ist eine Methode, die verwendet wird, um den Prozess für einige Sekunden oder die gewünschte Zeit zu halten. Weil Sie keine provozieren müssen notify() oder notifyAll() Methode, um diesen Thread zurück zu bekommen. Oder Sie benötigen keinen anderen Thread, um diesen Thread zurückzurufen. Wenn du möchtest, dass nach ein paar Sekunden etwas passiert, wie in einem Spiel nach dem Zug des Benutzers, möchtest du, dass der Benutzer wartet, bis der Computer spielt, dann kannst du das erwähnen sleep() Methode.

Und noch ein wichtiger Unterschied, der oft in Interviews gefragt wird: sleep() gehört Thread Klasse und wait() gehört Object Klasse.

Dies sind alle Unterschiede zwischen sleep() und wait().

Und es gibt eine Ähnlichkeit zwischen beiden Methoden: Beide sind eine kontrollierte Anweisung, also müssen Sie Catch oder Würfe versuchen, um auf diese Methoden zuzugreifen.

Ich hoffe, dies wird dir helfen.


18
2018-04-19 07:02