Unterschiede zwischen Wait() und Sleep()?
Thread.sleep() Sobald seine Arbeit abgeschlossen ist, gibt es den Lock nur dann für alle frei. Bis dahin gibt es den Lock nie für jemanden frei.
Sleep() nimmt den Schlüssel, gibt ihn nie an irgendjemanden frei, wenn seine Arbeit abgeschlossen ist, gibt er ihn nur frei und nimmt dann nur den Schlüssel von Threads im Wartezustand.
Object.wait() Wenn er in den Wartezustand geht, lässt er den Schlüssel frei und wartet einige Sekunden basierend auf dem Parameter.
Zum Beispiel:
Sie halten den Kaffee in Ihrer rechten Hand, Sie können einen anderen von gleicher Hand nehmen, wenn Sie ihn ablegen, nehmen Sie erst dann ein gleiches Objekt hier. Ebenfalls. Das ist sleep(), in Ihrer Schlafzeit machen Sie keine Arbeit, Sie schlafen nur... genauso hier auch.
wait(). Wenn Sie etwas ablegen und ein anderes nehmen, während Sie warten, das ist wait
Sie schauen einen Film oder irgendetwas auf Ihrem System, genau wie ein Player können Sie nicht mehr als einen zur gleichen Zeit abspielen, hier ist es dasselbe, wenn Sie schließen und ein anderes Video oder Lied wählen, ist es in der Zwischenzeit warten.
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/…