Eine wait
kann von einem anderen Thread "aufgeweckt" werden, der notify
auf dem Monitor aufruft, auf dem gewartet wird, während ein sleep
dies nicht kann. Außerdem muss ein wait
(und notify
) in einem blockierten synchronized
am Monitorobjekt erfolgen, während sleep
das nicht erforderlich macht:
Object mon = ...;
synchronized (mon) {
mon.wait();
}
An diesem Punkt wartet der aktuell ausgeführte Thread und gibt den Monitor frei. Ein anderer Thread kann das Folgende tun
synchronized (mon) { mon.notify(); }
(am gleichen mon
-Objekt) und der erste Thread (vorausgesetzt, er ist der einzige Thread, der auf dem Monitor wartet) wird aufwachen.
Sie können auch notifyAll
aufrufen, wenn mehr als ein Thread auf den Monitor wartet - dies wird alle von ihnen aufwecken. Allerdings wird nur einer der Threads in der Lage sein, den Monitor zu erfassen (denken Sie daran, dass das wait
in einem synchronized
-Block steht) und fortfahren - die anderen werden dann blockiert, bis sie den Sperren des Monitors erwerben können.
Ein weiterer Punkt ist, dass Sie wait
auf Object
selbst aufrufen (d.h. Sie warten auf den Monitor eines Objekts), während Sie sleep
auf Thread
aufrufen.
Noch ein weiterer Punkt ist, dass Sie aus wait
willkürliche Aufweckungen erhalten können (d.h. der Thread, der wartet, setzt sich aus keinem ersichtlichen Grund fort). Sie sollten immer wait
verwenden, während Sie auf eine Bedingung warten, wie folgt:
synchronized {
while (!condition) { mon.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/…