Was ist der Unterschied zwischen a wait()
und sleep()
in Threads?
Verstehe ich, dass sich ein wait()
-ing-Thread noch im laufenden Modus befindet und CPU-Zyklen verwendet, ein sleep()
-ing jedoch keine korrekten CPU-Zyklen verbraucht?
Warum haben wir beide wait()
und sleep()
: Wie variiert ihre Implementierung auf einer niedrigeren Ebene?
Antworten:
A
wait
kann von einem anderen Thread "geweckt" werden, dernotify
den Monitor aufruft, auf den gewartet wird, während asleep
dies nicht kann. Außerdem muss einwait
(undnotify
) in einem Blocksynchronized
auf dem Monitorobjekt vorkommen, währendsleep
dies nicht der Fall ist:Zu diesem Zeitpunkt wartet der aktuell ausgeführte Thread und gibt den Monitor frei . Ein anderer Thread kann dies tun
(auf demselben
mon
Objekt) und der erste Thread (vorausgesetzt, es ist der einzige Thread, der auf dem Monitor wartet) werden aktiviert.Sie können auch anrufen,
notifyAll
wenn mehr als ein Thread auf dem Monitor wartet - dies weckt alle auf . Es kann jedoch nur einer der Threads den Monitor greifen (denken Sie daran, dass sich derwait
in einemsynchronized
Block befindet) und weitermachen - die anderen werden dann blockiert, bis sie die Sperre des Monitors erreichen können.Ein weiterer Punkt ist , dass Sie rufen Sie
wait
anObject
sich selbst (dh Sie auf ein Objekt des Monitors warten) , während Sie rufensleep
aufThread
.Noch ein weiterer Punkt ist , dass man bekommen kann unechte Wakeups aus
wait
(dh der Faden, der Lebensläufe ohne ersichtlichen Grund wartet). Sie sollten immerwait
unter bestimmten Bedingungen wie folgt drehen :quelle
wait
/notify
werden normalerweise verwendet, um auf einen anderen Thread zu warten, um eine Aufgabe auszuführen, oder um zu warten, bis eine bestimmte Bedingung erfüllt ist.Ein wesentlicher Unterschied noch nicht erwähnt ist , dass während ein Thema Schlafen nicht nicht Arretierungen es hält, während des Wartens auf die Sperre auf das Objekt , das
wait()
aufgerufen wird.quelle
sleep
hält Java Schlösser, aber es funktioniert nicht. Um einen fairen Vergleich zu haben, würden wir vergleichensynchronized(OUTER_LOCK){ Thread.sleep(1000); }
mitsynchronized(OUTER_LOCK){ synchronized(LOCK){LOCK.wait();} }
und wir können sehen , dass beide Befehle nicht loslassen dasOUTER_LOCK
. Wenn es einen Unterschied gibt, können wir sagen, dass Java- Sperrensleep
nicht explizit verwendet werden , aber die Frage lautet: "Wie variiert ihre Implementierung auf einer niedrigeren Ebene?" unquote.wait()
ist mit dem Zustand der innersten Sperre verbunden, von der aus es aufgerufen wird. In Ihrem Codebeispielwait()
kann es nur freigegeben werdenLOCK
und nichtOUTER_LOCK
. So ist der Java-Monitor sowieso aufgebaut. Ein fairer Vergleich wäresynchronized(OUTER_LOCK){ synchronized(LOCK) { Thread.sleep(1000); } }
undsynchronized(OUTER_LOCK){ synchronized(LOCK) { LOCK.wait(); } }
. In diesem Fallsleep()
beiden Schlösser halten wird , währendwait()
freigeben wird ,LOCK
aber immer noch haltenOUTER_LOCK
Ich fand diesen Beitrag hilfreich. Es stellt den Unterschied zwischen
Thread.sleep()
,Thread.yield()
undObject.wait()
in menschlicher Hinsicht. Zitieren:quelle
sleep(n)
besagt implizit, dass der aktuell ausgeführte Thread den Monitor der Sperre freiwillig aufgibt, was nicht der Fall ist . Zitat aus Threads Javadoc : "Der Thread verliert nicht den Besitz von Monitoren."sleep
sie kein spezielles Verhalten in Bezug auf den Monitor aufweisen als jeder andere Java-Methodenaufruf, dh sie interagieren oder modifizieren sie in keiner Weise. Wenn Sie etwas über Monitore sagen möchten, sollten Sie angeben, dasswait
zusätzlich zu den oben genannten Dingen die Sperre für das aufgerufene Objekt vorübergehend aufgehoben wird.wait(n)
zum Vergleichen mitsleep(n)
. Es macht keinen Sinn, mit dem No-Arg zu vergleichen.Hier gibt es viele Antworten, aber ich konnte die semantische Unterscheidung nicht finden.
Es geht nicht um den Thread selbst; Beide Methoden sind erforderlich, da sie sehr unterschiedliche Anwendungsfälle unterstützen.
sleep()
Sendet den Thread in den Ruhezustand wie zuvor, packt nur den Kontext und stoppt die Ausführung für eine vordefinierte Zeit. Um es also vorzeitig zu aktivieren, müssen Sie die Thread-Referenz kennen. Dies ist in einer Multithread-Umgebung keine häufige Situation. Es wird hauptsächlich für die Zeitsynchronisation (z. B. Aufwachen in genau 3,5 Sekunden) und / oder für hartcodierte Fairness verwendet (schlafen Sie einfach eine Weile und lassen Sie andere Threads arbeiten).wait()
Im Gegenteil, es handelt sich um einen Thread- (oder Nachrichten-) Synchronisationsmechanismus, mit dem Sie einen Thread benachrichtigen können, über den Sie keine Referenz gespeichert haben (und für den Sie sich nicht interessieren). Sie können es sich als Publish-Subscribe-Musterwait
vorstellen ( == subscribe undnotify()
== Publish). Grundsätzlich senden Sie mit notify () eine Nachricht (die möglicherweise gar nicht empfangen wird und normalerweise egal ist).Zusammenfassend lässt sich sagen, dass Sie normalerweise
sleep()
für diewait()
Zeitsynchronisation und für die Multithread-Synchronisation verwenden.Sie könnten auf die gleiche Weise im zugrunde liegenden Betriebssystem oder überhaupt nicht implementiert werden (da frühere Versionen von Java kein echtes Multithreading hatten; wahrscheinlich tun dies auch einige kleine VMs nicht). Vergessen Sie nicht, dass Java auf einer VM ausgeführt wird, sodass Ihr Code je nach VM / OS / HW, auf dem er ausgeführt wird, in etwas anderes umgewandelt wird.
quelle
Hier habe ich einige wichtige Unterschiede zwischen
wait()
undsleep()
Methoden aufgelistet .PS: Klicken Sie auch auf die Links, um den Bibliothekscode anzuzeigen (internes Arbeiten, spielen Sie zum besseren Verständnis nur ein wenig herum).
warten()
wait()
Methode gibt die Sperre frei.wait()
ist die Methode derObject
Klasse.wait()
ist die nicht statische Methode -public final void wait() throws InterruptedException { //...}
wait()
sollte durchnotify()
odernotifyAll()
Methoden benachrichtigt werden.wait()
Die Methode muss aus einer Schleife aufgerufen werden, um mit Fehlalarmen umgehen zu können.wait()
Die Methode muss aus dem synchronisierten Kontext (dh der synchronisierten Methode oder dem synchronisierten Block) aufgerufen werden, andernfalls wird sie ausgelöstIllegalMonitorStateException
Schlaf()
sleep()
Methode gibt die Sperre nicht frei.sleep()
ist die Methode derjava.lang.Thread
Klasse.sleep()
ist die statische Methode -public static void sleep(long millis, int nanos) throws InterruptedException { //... }
sleep()
ist abgeschlossen.sleep()
Besser nicht aus der Schleife aufrufen ( siehe Code unten ).sleep()
kann von überall angerufen werden. Es gibt keine besonderen Anforderungen.Ref: Unterschied zwischen Warten und Schlafen
Code-Snippet zum Aufrufen der Wait and Sleep-Methode
quelle
Thread.sleep()
wird verwendet, um die Prozessorzeit für die anderen Threads verfügbar zu machen. Die Ruhephase kann durch Interrupts (dh durch JVM) beendet werden. Lesen Sie diese stackoverflow.com/questions/4264355/…notify()
odernotifyAll()
sindObject
Klassenmethoden. daher sind sie für alle Klassen verfügbar (dh hier auch fürThread
Klassen). Siehe den Code grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…Es gibt einige wichtige Hinweise, die ich nach der Arbeit an Warten und Schlafen abschließe. Schauen Sie sich zuerst das Beispiel mit wait () und sleep () an:
Beispiel 1 : Verwenden von wait () und sleep ():
Lassen Sie einige wichtige Hinweise klarstellen:
Bitte korrigieren Sie mich, wenn ich falsch liege.
quelle
Unterschied zwischen wait () und sleep ()
Der wesentliche Unterschied besteht darin , dass
wait()
ausObject
undsleep()
ist eine statische MethodeThread
.Der Hauptunterschied besteht darin, dass
wait()
die Sperresleep()
aufgehoben wird, während während des Wartens keine Sperre aufgehoben wird.wait()
wird für die Kommunikation zwischen Threads verwendet, währendsleep()
im Allgemeinen eine Pause bei der Ausführung eingeführt wird.wait()
sollte von innen synchronisiert aufgerufen werden oder wir bekommen eineIllegalMonitorStateException
, währendsleep()
kann überall aufgerufen werden.wait()
, müssen Sienotify()
oder aufrufennotifyAll()
. Wie fürsleep(),
den Thread nach einem bestimmten Zeitintervall wird gestartet.Ähnlichkeiten
quelle
Dies ist eine sehr einfache Frage, da beide Methoden eine völlig unterschiedliche Verwendung haben.
Der Hauptunterschied besteht darin, zu warten, bis die Sperre oder der Monitor freigegeben ist, während der Ruhezustand während des Wartens keine Sperre oder Überwachung aufhebt. Wait wird für die Kommunikation zwischen Threads verwendet, während Sleep verwendet wird, um eine Pause bei der Ausführung einzuführen.
Dies war nur eine klare und grundlegende Erklärung. Wenn Sie mehr wollen, lesen Sie weiter.
Im Falle eines
wait()
Methoden-Threads befindet er sich im Wartezustand und wird nicht automatisch zurückgegeben, bis dienotify()
Methode aufgerufen wird (odernotifyAll()
wenn sich mehr als ein Thread im Wartezustand befindet und Sie alle diese Threads aktivieren möchten). Und Sie benötigen eine synchronisierte Sperre oder Objektsperre oder Klassensperre, um auf die Methodenwait()
odernotify()
oder zugreifen zunotifyAll()
können. Und noch etwas, daswait()
Methode wird für die Kommunikation zwischen Threads verwendet, da Sie einen anderen Thread benötigen, um diesen Thread zu aktivieren, wenn sich ein Thread im Wartezustand befindet.In diesem Fall
sleep()
handelt es sich jedoch um eine Methode, mit der der Vorgang einige Sekunden oder die gewünschte Zeit gehalten wird. Weil Sie keinenotify()
oder keinenotifyAll()
Methode provozieren müssen , um diesen Thread zurückzubekommen. Oder Sie benötigen keinen anderen Thread, um diesen Thread zurückzurufen. Wenn Sie möchten, dass nach wenigen Sekunden etwas passiert, wie in einem Spiel nach dem Zug des Benutzers, möchten Sie, dass der Benutzer wartet, bis der Computer spielt, dann können Sie das erwähnensleep()
Methode .Und noch ein wichtiger Unterschied, der in Interviews oft gefragt wird:
sleep()
gehört zurThread
Klasse undwait()
gehört dazuObject
Klasse.Dies sind alle Unterschiede zwischen
sleep()
undwait()
.Und es gibt eine Ähnlichkeit zwischen beiden Methoden: Beide sind geprüfte Anweisungen, daher müssen Sie catch oder throw versuchen, um auf diese Methoden zuzugreifen.
Ich hoffe, dies wird dir helfen.
quelle
Quelle: http://www.jguru.com/faq/view.jsp?EID=47127
quelle
Warten und Schlafen sind zwei verschiedene Dinge:
sleep()
Thread funktioniert für die angegebene Dauer nicht mehr.wait()
Thread funktioniert es nicht mehr, bis das Objekt, auf das gewartet wird, im Allgemeinen von anderen Threads benachrichtigt wird.quelle
sleep
, wenn Sie möchten, dass er angehalten wird, bis eine Eingabe von der anderen stammt, verwenden Siewait
/notify
.interrupt
soll einem Thread signalisieren, dass er aufhören soll, was er tut, und beenden soll. Es wird von E / A-Funktionen behandeltsleep
,wait
blockiert diese aber auch (und Sie können Funktionen mit demselben Verhalten implementieren, indem Sie die Methode aufrufenThread.interrupted()
). In Bezug auf die Leistung werden Funktionen normalerweise für das Ziel optimiert, für das sie entworfen wurden.sleep
ist eine Methode vonThread
,wait
ist eine Methode vonObject
,wait/notify
ist also eine Technik zum Synchronisieren gemeinsam genutzter Daten in Java (mithilfe von Monitor ),sleep
ist jedoch eine einfache Methode des Threads, um sich selbst anzuhalten.quelle
sleep () ist eine Methode, die verwendet wird, um den Prozess für einige Sekunden oder die gewünschte Zeit anzuhalten. Im Falle von wait () befindet sich der Methodenthread im Wartezustand und wird nicht automatisch zurückgegeben, bis wir notify () oder aufrufen notifyAll ().
Der Hauptunterschied besteht darin, dass wait () die Sperre oder den Monitor aufhebt, während sleep () während des Wartens keine Sperre oder keinen Monitor aufhebt. Wait wird für die Kommunikation zwischen Threads verwendet, während Sleep verwendet wird, um im Allgemeinen eine Pause bei der Ausführung einzuführen.
Thread.sleep () versetzt den aktuellen Thread für einige Zeit in den Status "Nicht ausführbar". Der Thread behält die von ihm erfassten Monitore bei. Wenn sich der Thread derzeit in einem synchronisierten Block oder einer synchronisierten Methode befindet, kann kein anderer Thread in diesen Block oder diese Methode eintreten. Wenn ein anderer Thread t.interrupt () aufruft, wird der schlafende Thread aktiviert. Beachten Sie, dass der Ruhezustand eine statische Methode ist. Dies bedeutet, dass er immer den aktuellen Thread betrifft (den, der die Schlafmethode ausführt). Ein häufiger Fehler besteht darin, t.sleep () aufzurufen, wobei t ein anderer Thread ist. Selbst dann ist es der aktuelle Thread, der in den Ruhezustand wechselt, nicht der t-Thread.
object.wait () versetzt den aktuellen Thread wie sleep () in den Status "Nicht ausführbar", jedoch mit einer Wendung. Wait wird für ein Objekt aufgerufen, nicht für einen Thread. Wir nennen dieses Objekt das "Sperrobjekt". Bevor lock.wait () aufgerufen wird, muss der aktuelle Thread für das Sperrobjekt synchronisiert werden. wait () gibt dann diese Sperre frei und fügt den Thread zur Warteliste hinzu, die der Sperre zugeordnet ist. Später kann ein anderer Thread mit demselben Sperrobjekt synchronisieren und lock.notify () aufrufen. Dies weckt den ursprünglichen, wartenden Thread. Grundsätzlich ist wait () / notify () wie sleep () / interrupt (), nur der aktive Thread benötigt keinen direkten Zeiger auf den schlafenden Thread, sondern nur auf das gemeinsam genutzte Sperrobjekt.
Lassen Sie uns alle oben genannten Punkte kategorisieren:
Call on:
Synchronized:
Hold lock:
Wake-up condition:
Usage:
Ref: diff
sleep
undwait
quelle
In einfachen Worten, warten ist warten, bis ein anderer Thread Sie aufruft, während sleep für einen bestimmten Zeitraum "nächste Anweisung nicht ausführen" lautet.
Darüber hinaus ist sleep eine statische Methode in der Thread-Klasse und arbeitet mit Thread, während wait () in der Object-Klasse ist und für ein Objekt aufgerufen wird.
Ein weiterer Punkt, wenn Sie wait für ein Objekt aufrufen, synchronisiert der betreffende Thread das Objekt und wartet dann. :) :)
quelle
wait
undsleep
Methoden sind sehr unterschiedlich:sleep
hat keine Möglichkeit "aufzuwachen",wait
es eine Möglichkeit gibt, während der Wartezeit "aufzuwachen", indem ein anderer Threadnotify
oder aufruftnotifyAll
.Kommen Sie, um darüber nachzudenken, die Namen sind in dieser Hinsicht verwirrend; ist jedoch
sleep
ein Standardname und entsprichtwait
demWaitForSingleObject
oderWaitForMultipleObjects
in der Win-API.quelle
Aus diesem Beitrag: http://javaconceptoftheday.com/difference-between-wait-and-sleep-methods-in-java/
wait () Methode.
1) Der Thread, der die wait () -Methode aufruft, gibt die darin enthaltene Sperre frei.
2) Der Thread gewinnt die Sperre zurück, nachdem andere Threads entweder die Methoden notify () oder notifyAll () für dieselbe Sperre aufgerufen haben.
3) Die wait () -Methode muss innerhalb des synchronisierten Blocks aufgerufen werden.
4) Die wait () -Methode wird immer für Objekte aufgerufen.
5) Wartende Threads können von anderen Threads durch Aufrufen der Methoden notify () oder notifyAll () aktiviert werden.
6) Um die wait () -Methode aufzurufen, muss der Thread über eine Objektsperre verfügen.
sleep () Methode
1) Der Thread, der die sleep () -Methode aufruft, gibt die darin enthaltene Sperre nicht frei.
2) Die sleep () -Methode kann innerhalb oder außerhalb des synchronisierten Blocks aufgerufen werden.
3) Die sleep () -Methode wird immer für Threads aufgerufen.
4) Schlafende Threads können nicht von anderen Threads geweckt werden. In diesem Fall löst der Thread eine InterruptedException aus.
5) Um die sleep () -Methode aufzurufen, muss der Thread keine Objektsperre haben.
quelle
Hier befindet sich wait () im Wartezustand, bis es von einem anderen Thread benachrichtigt wird, aber wo sleep () einige Zeit haben wird. Danach wird es automatisch in den Bereitschaftszustand versetzt ...
quelle
wait()
ist eine Methode derObject
Klasse.sleep()
ist eine Methode derThread
Klasse.sleep()
Ermöglicht dem Thread,sleep
für x Millisekunden in den Status zu wechseln.Wenn ein Thread in den Ruhezustand wechselt
it doesn’t release the lock
.wait()
ermöglicht dem Thread, die Sperre zu lösen undgoes to suspended state
.Dieser Thread ist aktiv, wenn eine
notify()
odernotifAll()
-Methode für dasselbe Objekt aufgerufen wird.quelle
Ein möglicher großer Unterschied zwischen Schlaf / Interrupt und Warten / Benachrichtigen ist der folgende
interrupt()
währendsleep()
löst immer eine Ausnahme aus (z. B. InterruptedException )notify()
währendwait()
nicht.Das Generieren einer Ausnahme, wenn sie nicht benötigt wird, ist ineffizient. Wenn Sie Threads haben, die mit einer hohen Rate miteinander kommunizieren, würde dies viele Ausnahmen erzeugen, wenn Sie die ganze Zeit Interrupt aufrufen, was eine totale Verschwendung von CPU darstellt.
quelle
Sie haben Recht - Sleep () bewirkt, dass dieser Thread "in den Ruhezustand versetzt" wird und die CPU ausgeht und andere Threads (auch als Kontextwechsel bezeichnet) verarbeitet, wobei Wait meiner Meinung nach die CPU dazu bringt, den aktuellen Thread zu verarbeiten.
Wir haben beides, denn obwohl es sinnvoll erscheint, andere Benutzer die CPU verwenden zu lassen, während Sie sie nicht verwenden, ist das Umschalten des Kontexts tatsächlich mit einem Overhead verbunden - je nachdem, wie lange der Ruhezustand dauert, kann dies in CPU-Zyklen teurer sein Threads zu wechseln, als es ist, einfach Ihren Thread für ein paar ms nichts tun zu lassen.
Beachten Sie auch, dass der Schlaf einen Kontextwechsel erzwingt.
Außerdem kann das Betriebssystem während der Wartezeit (im Allgemeinen ist es nicht möglich, die Kontextumschaltung zu steuern) andere Threads verarbeiten (und wird dies auch für längere Wartezeiten tun).
quelle
interrupt
. Die Endzeit istn
inwait(n)
. ¶¶ Es ist jetzt 8 Jahre her und immer noch hat niemand die Antwort!Die Methoden werden für verschiedene Dinge verwendet.
Thread.sleep (n) kann unterbrochen werden, Object.wait () muss jedoch benachrichtigt werden. Es ist möglich, die maximale Wartezeit anzugeben:
Object.wait(5000)
Es wäre also möglich, dies zu verwendenwait
, ähm,sleep
aber dann müssen Sie sich um Sperren kümmern.Keine der Methoden verwendet die CPU im Schlaf / Warten.
Die Methoden werden unter Verwendung von nativem Code implementiert, wobei ähnliche Konstrukte verwendet werden, jedoch nicht auf dieselbe Weise.
Überzeugen Sie sich selbst: Ist der Quellcode nativer Methoden verfügbar? Die Datei
/src/share/vm/prims/jvm.cpp
ist der Ausgangspunkt ...quelle
Thread.sleep(big_num)
muss unterbrochen werden.Object.wait(small_num)
kann benachrichtigt werden.Warten () und schlafen () Unterschiede?
Thread.sleep () Sobald seine Arbeit abgeschlossen ist, wird nur die Sperre für alle freigegeben. bis es niemals das Schloss für irgendjemanden freigibt.
Object.wait () Wenn es in die Wartephase geht, gibt es den Schlüssel frei und wartet basierend auf dem Parameter einige Sekunden.
Zum Beispiel:
Wenn Sie den Kaffee in Ihre rechte Hand nehmen, können Sie einen anderen von derselben Hand nehmen. Wann wird Ihr Ablegen dann nur ein anderes Objekt des gleichen Typs hier nehmen? ebenfalls. das ist sleep () du schläfst du hast keine arbeit gemacht, du schläfst nur .. das gleiche auch hier.
warten(). Wenn Sie niedergeschlagen sind und einen anderen nehmen, während Sie warten, ist das Warten
Sie spielen einen Film oder etwas in Ihrem System ab, genauso wie ein Player, den Sie nicht mehr als einen gleichzeitig abspielen können. Das ist hier, wenn Sie einen anderen Film oder Song schließen und auswählen, während Sie warten
quelle
wait
gibt die Sperre frei undsleep
tut es nicht. Ein Thread sich in Wartestellung ist , die für das Aufwachen, sobaldnotify
odernotifyAll
genannt wird. Aber im Falle, dasssleep
der Thread die Sperre behält und er erst dann berechtigt ist, wenn die Ruhezeit abgelaufen ist.quelle
InterruptedException
wird geworfen, so wie es im Javadoc steht.sleep()
Die Methode bewirkt, dass der aktuelle Thread für eine bestimmte Zeit vom laufenden Status in den Blockstatus wechselt. Wenn der aktuelle Thread die Sperre eines Objekts hat, hält er diese weiterhin, was bedeutet, dass andere Threads keine synchronisierte Methode in diesem Klassenobjekt ausführen können.wait()
Die Methode bewirkt, dass der aktuelle Thread entweder für eine bestimmte Zeit oder bis zur Benachrichtigung in den Blockstatus wechselt. In diesem Fall gibt der Thread jedoch die Sperre des Objekts frei (was bedeutet, dass andere Threads alle synchronisierten Methoden des aufrufenden Objekts ausführen können.quelle
Meiner Meinung nach besteht der Hauptunterschied zwischen beiden Mechanismen darin, dass Sleep / Interrupt die grundlegendste Art des Umgangs mit Threads ist, während Wait / Notify eine Abstraktion ist, die darauf abzielt, die Kommunikation zwischen Threads zu vereinfachen. Dies bedeutet, dass Schlaf / Interrupt alles kann, aber dass diese spezielle Aufgabe schwieriger zu erledigen ist.
Warum ist Warten / Benachrichtigen besser geeignet? Hier einige persönliche Überlegungen:
Es erzwingt die Zentralisierung. Es ermöglicht die Koordination der Kommunikation zwischen einer Gruppe von Threads mit einem einzelnen gemeinsam genutzten Objekt. Dies vereinfacht die Arbeit erheblich.
Es erzwingt die Synchronisation. Weil der Programmierer den Aufruf zum Warten / Benachrichtigen in einen synchronisierten Block einschließt.
Es ist unabhängig von der Herkunft und Anzahl der Threads. Mit diesem Ansatz können Sie beliebig mehr Threads hinzufügen, ohne die anderen Threads zu bearbeiten oder die vorhandenen zu verfolgen. Wenn Sie Sleep / Interrupt verwendet haben, müssen Sie zuerst die Verweise auf die Sleeping-Threads beibehalten und sie dann einzeln von Hand unterbrechen.
Ein Beispiel aus dem wirklichen Leben, das gut erklärt werden kann, ist ein klassisches Restaurant und die Methode, mit der das Personal untereinander kommuniziert: Die Kellner lassen die Kundenanfragen an einem zentralen Ort (einer Korkplatte, einem Tisch usw.). klingeln, und die Arbeiter aus der Küche kommen, um solche Anfragen entgegenzunehmen. Sobald ein Kurs fertig ist, klingelt das Küchenpersonal erneut, damit die Kellner es bemerken und zu den Kunden bringen.
quelle
Ein Beispiel für den Schlaf löst die Sperre nicht und das Warten nicht
Hier gibt es zwei Klassen:
Singleton : Dies ist eine Singleton-Klasse mit zwei statischen Methoden, getInstance () und getInstance (boolean isWait).
und
Führen Sie nun dieses Beispiel aus, um die folgende Ausgabe zu erhalten:
Hier sind Singleton-Instanzen, die von threadA und threadB erstellt wurden, identisch. Dies bedeutet, dass ThreadB draußen wartet, bis ThreadA seine Sperre aufhebt.
Ändern Sie nun die Datei Singleton.java, indem Sie Thread.sleep (500) kommentieren. Methode und Kommentieren von Singleton.class.wait (500); . Hier wegen Singleton.class.wait (500); Die Methode threadA gibt alle Erfassungssperren frei und wechselt in den Status "Nicht ausführbar". ThreadB erhält eine Änderung, um in den synchronisierten Block einzutreten.
Jetzt nochmal laufen lassen:
Hier sind von threadA und threadB erstellte Singleton-Instanzen NICHT identisch, da threadB geändert wurde, um in den synchronisierten Block einzutreten. Nach 500 Millisekunden startete threadA von seiner letzten Position und erstellte ein weiteres Singleton-Objekt.
quelle
Sollte vom synchronisierten Block aufgerufen werden: Die
wait()
Methode wird immer vom synchronisierten Block aufgerufen, dh diewait()
Methode muss den Objektmonitor vor dem Objekt sperren, für das sie aufgerufen wird. Diesleep()
Methode kann jedoch von außerhalb des synchronisierten Blocks aufgerufen werden, d. H.sleep()
Methode benötigt keinen Objektmonitor.IllegalMonitorStateException: Wenn die
wait()
Methode aufgerufen wird, ohne eine Objektsperre zu erhalten,IllegalMonitorStateException
wird sie zur Laufzeit ausgelöst, diesleep()
Methode löst jedoch niemals eine solche Ausnahme aus.Gehört zu welcher Klasse:
wait()
Methode gehört zurjava.lang.Object
Klasse, abersleep()
Methode gehört zurjava.lang.Thread
Klasse.Wird für Objekt oder Thread aufgerufen: Die
wait()
Methode wird für Objekte aufgerufen, aber diesleep()
Methode wird für Threads und nicht für Objekte aufgerufen.Thread-Status: wenn
wait()
Methode auf dem Objekt aufgerufen wird, Thread, holded Objekts des Monitors geht vom Laufen zu Wartebetrieb und kann zu runnable Zustand zurück , nur wennnotify()
odernotifyAll()
Methode für das Objekt aufgerufen wird. Und später plant der Thread-Scheduler, dass dieser Thread vom ausführbaren zum laufenden Status wechselt. Wenn einsleep()
Thread aufgerufen wird, wechselt er vom laufenden in den wartenden Zustand und kann nach Ablauf der Ruhezeit in den ausführbaren Zustand zurückkehren.Beim Aufruf aus dem synchronisierten Block: Wenn die
wait()
Methode aufgerufen wird, verlässt der Thread die Objektsperre. Abersleep()
Verfahren , wenn von synchronisierten Block oder Methode Thread aufgerufen nicht Blätter Sperrobjekt.Weitere Informationen
quelle
Von der Oracle-Dokumentationsseite auf wait () Methode von
Object
:notify()
Methode oder dienotifyAll()
Methode für dieses Objekt aufruft . Mit anderen Worten, diese Methode verhält sich genau so, als würde sie den Aufruf einfach ausführenwait(0)
.Diese Methode wirft
IllegalMonitorStateException
- Wenn der aktuelle Thread nicht der Eigentümer des Objektmonitors ist.InterruptedException
- Wenn ein Thread den aktuellen Thread unterbrochen hat, bevor oder während der aktuelle Thread auf eine Benachrichtigung wartete. Der unterbrochene Status des aktuellen Threads wird gelöscht, wenn diese Ausnahme ausgelöst wird.Von der Oracle-Dokumentationsseite zur sleep () -Methode der
Thread
Klasse:Diese Methode wirft:
IllegalArgumentException
- wenn der Wert von Millis negativ istInterruptedException
- Wenn ein Thread den aktuellen Thread unterbrochen hat. Der unterbrochene Status des aktuellen Threads wird gelöscht, wenn diese Ausnahme ausgelöst wird.Anderer Hauptunterschied:
wait()
ist eine nicht statische Methode (Instanzmethode) im Gegensatz zur statischen Methodesleep()
(Klassenmethode).quelle
wait()
ist innerhalb einer synchronisierten Methode gegeben , währendsleep()
in einem nicht synchronisierten Verfahren gegeben, weilwait()
Methode für das Objekt die Sperre freizugeben , sondernsleep()
oderyield()
des entbindetlock()
.quelle
sleep()
kann sich innerhalb einessynchronized
Blocks oder einer Methode befinden. Antwort erklärt nichts.wait(1000)
bewirkt , dass der aktuelle Thread bis zu einer Sekunde in den Ruhezustand wechselt .notify()
odernotifyAll()
empfängt .sleep(1000)
bewirkt , dass der aktuelle Thread genau 1 Sekunde lang in den Ruhezustand wechselt .quelle
sleep(1000)
garantiert nicht, genau 1 Sekunde zu schlafen. Es kann vorher unterbrochen werden.Eigentlich ist das alles in Java-Dokumenten klar beschrieben (aber das habe ich erst nach dem Lesen der Antworten erkannt).
http://docs.oracle.com/javase/8/docs/api/index.html :
wait () - Der aktuelle Thread muss den Monitor dieses Objekts besitzen. Der Thread gibt den Besitz dieses Monitors frei und wartet, bis ein anderer Thread Threads benachrichtigt, die auf dem Monitor dieses Objekts warten, um entweder durch einen Aufruf der notify-Methode oder der notifyAll-Methode aufzuwecken. Der Thread wartet dann, bis er wieder Eigentümer des Monitors werden kann und die Ausführung fortsetzt.
sleep () - Bewirkt, dass der aktuell ausgeführte Thread für die angegebene Anzahl von Millisekunden in den Ruhezustand versetzt wird (die Ausführung wird vorübergehend eingestellt), abhängig von der Genauigkeit und Genauigkeit der Systemzeitgeber und -planer. Der Thread verliert nicht den Besitz von Monitoren.
quelle