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
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?
3 Stimmen
Hier ist ein guter Artikel, der es beschreibt: qat.com/using-waitnotify-instead-thread-sleep-java
3 Stimmen
Es ist GANZ genau das Gegenteil - sleep "verwendet" alle verfügbaren CPU-Zyklen, aber da der Thread sich im "WARTEN" -Zustand befindet, können diese bei Bedarf abgegeben werden - tatsächlich geben die meisten Betriebssysteme automatisch die Zyklen ab WENN es möglich ist, daher wird Ihr Thread keine tatsächliche CPU-Last erzeugen... auf älteren Betriebssystemen wird er dies jedoch tun. Object.wait() hingegen verwendet NIE Zyklen (während er nicht benachrichtigt wird), da dies in vielen Fällen über Software-Unterbrechungen realisiert wird - private, flüchtige und transparente Sperren, implementiert durch die JVM. Thread.sleep ist schlechte Praxis.
0 Stimmen
@specializt "Thread.sleep ist eine schlechte Praxis", wenn es anstelle von wait verwendet wird. siehe stackoverflow.com/questions/17826651/… Aber guter Kommentar dabei.
0 Stimmen
Wenn Sie gerade auf diese Frage gestoßen sind, helfen Ihnen diese beiden Fragen, weitere Details zu erhalten, wenn Sie nach dem Lesen der Antwort verwirrt sind stackoverflow.com/questions/3362303/whats-a-monitor-in-java stackoverflow.com/questions/30262209/…