Dies ist eine sehr einfache Frage, da diese Methoden völlig unterschiedlich verwendet werden.
Der Hauptunterschied besteht darin, dass das Freigeben des Schlosses oder Monitors beim Warten verzögert wird, während beim Schlafen kein Schloss oder Monitor freigegeben wird. Warten wird für die Inter-Thread-Kommunikation verwendet, während Schlafen eine Pause in der Ausführung einführt.
Dies war nur eine klare und grundlegende Erklärung, wenn Sie mehr möchten, dann lesen Sie weiter.
Im Falle der wait()
-Methode wechselt der Thread in den Wartezustand und kommt nicht automatisch zurück, bis wir die notify()
-Methode aufrufen (oder notifyAll()
wenn mehr als ein Thread im Wartezustand ist und alle diese Threads weckt). Und Sie benötigen synchronisiertes oder Objektschloss oder Klassenschloss, um auf die Methoden wait()
oder notify()
oder notifyAll()
zuzugreifen. Und noch etwas, die wait()
-Methode wird für die Inter-Thread-Kommunikation verwendet, da, wenn ein Thread in den Wartezustand wechselt, Sie einen anderen Thread benötigen, um diesen Thread zu wecken.
Aber im Falle von sleep()
handelt es sich um eine Methode, die den Prozess für einige Sekunden oder die gewünschte Zeit anhält. Weil Sie keine notify()
- oder notifyAll()
-Methode provozieren müssen, um den Thread zurückzubekommen. Oder Sie benötigen keinen anderen Thread, um den Thread zurückzurufen. Wenn Sie also möchten, dass etwas nach einigen Sekunden passiert, wie in einem Spiel, nachdem der Benutzer an der Reihe ist, sollen Sie warten, bis der Computer spielt, dann können Sie die sleep()
-Methode erwähnen.
Und noch ein wichtiger Unterschied, der oft in Interviews gefragt wird: sleep()
gehört zur Klasse Thread
und wait()
gehört zur Klasse Object
.
Das sind alle Unterschiede zwischen sleep()
und wait()
.
Und es gibt eine Ähnlichkeit zwischen beiden Methoden: sie sind beide überprüfte Anweisungen, daher benötigen Sie ein Try-Catch oder Throws, um auf diese Methoden zuzugreifen.
Ich hoffe, das hilft Ihnen.
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/…