Sollte aus synchronisiertem Block aufgerufen werden : Die wait()
-Methode wird immer aus einem synchronisierten Block aufgerufen, d.h. die wait()
-Methode muss den Objektmonitor sperren, bevor sie auf dem Objekt aufgerufen wird. Aber die sleep()
-Methode kann von außerhalb des synchronisierten Blocks aufgerufen werden, d.h. die sleep()
-Methode benötigt keinen Objektmonitor.
IllegalMonitorStateException : Wenn die wait()
-Methode aufgerufen wird, ohne den Objektschloss zu erwerben, wird zur Laufzeit eine IllegalMonitorStateException
ausgelöst, aber die sleep()
-Methode wirft nie eine solche Ausnahme.
Gehört zu welcher Klasse : Die wait()
-Methode gehört zur Klasse java.lang.Object
, aber die sleep()
-Methode gehört zur Klasse java.lang.Thread
.
Auf Objekt oder Thread aufgerufen : Die wait()
-Methode wird auf Objekten aufgerufen, aber die sleep()
-Methode wird auf Threads und nicht auf Objekten aufgerufen.
Thread-Zustand : Wenn die wait()
-Methode auf einem Objekt aufgerufen wird, geht der Thread, der den Objektmonitor gehalten hat, vom Laufzustand in den Wartezustand über und kann nur in den ausführbaren Zustand zurückkehren, wenn die notify()
- oder notifyAll()
-Methode auf dem Objekt aufgerufen wird. Später plant der Thread-Scheduler diesen Thread, vom ausführbaren Zustand in den Laufzustand zu wechseln. Wenn die sleep()
-Methode auf einem Thread aufgerufen wird, geht dieser vom Laufzustand in den Wartezustand über und kann in den ausführbaren Zustand zurückkehren, wenn die Schlafzeit abgelaufen ist.
Wenn aus synchronisiertem Block aufgerufen : Wenn die wait()
-Methode aufgerufen wird, verlässt der Thread das Objektschloss. Aber die sleep()
-Methode, wenn sie aus einem synchronisierten Block oder einer synchronisierten Methode aufgerufen wird, verlässt das Objektschloss nicht.
Weitere Informationen hier
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/…