Der Unterschied zwischen wait () und sleep ()
-
10-07-2019 - |
Frage
Was ist der Unterschied zwischen einem wait()
und sleep()
in Threads?
Ist mein Verständnis, dass ein wait()
-ing Thema ist nach wie vor im Betriebsmodus und nutzt CPU-Zyklen, sondern ein sleep()
-ing verbraucht keine CPU-Zyklen korrekt?
Warum haben wir beide wait()
und sleep()
: wie funktioniert ihre Implementierung auf einem niedrigeren Niveau variiert
Lösung
A wait
kann von einem anderen Thread "aufgeweckt" werden, ruft notify
auf dem Monitor, der während eines sleep
kann nicht. Auch ein wait
(und notify
) müssen in einem Block synchronized
auf dem Monitor Objekt passieren während sleep
nicht:
Object mon = ...;
synchronized (mon) {
mon.wait();
}
An diesem Punkt der aktuell ausgeführten Thread wartet und gibt den Monitor . Ein anderer Thread kann tun
synchronized (mon) { mon.notify(); }
(auf dem gleichen mon
Objekt) und dem ersten Thread (vorausgesetzt, es ist der einzige Thread ist auf dem Monitor zu warten) wird aufwachen.
Sie können auch anrufen notifyAll
wenn mehr als ein Thread auf dem Monitor wartet - das wird aufwachen alle von ihnen nach oben . Doch der Lage sein, den Monitor nur eine der Threads greifen (denken Sie daran, dass die wait
in einem synchronized
Block) und weitermachen -. Die anderen werden dann blockiert werden, bis sie den Monitor Sperre erwerben kann
Ein weiterer Punkt ist, dass Sie rufen wait
auf Object
selbst (dh Sie auf ein Objekt des Monitors warten), während Sie sleep
auf Thread
.
Noch ein weiterer Punkt ist, dass man bekommen kann unechte Wakeups von wait
(das heißt den Faden, die Lebensläufe ohne ersichtlichen Grund wartet). Sie sollten immer wait
während auf einige Bedingung Spinnen wie folgt:
synchronized {
while (!condition) { mon.wait(); }
}
Andere Tipps
Ein wesentlicher Unterschied ist noch nicht erwähnt, dass, während ein Thema Schlafen tut nicht Arretierungen es hält, während die Sperre wartet auf das Objekt, dass wait()
heißt auf.
synchronized(LOCK) {
Thread.sleep(1000); // LOCK is held
}
synchronized(LOCK) {
LOCK.wait(); // LOCK is not held
}
Ich fand diesen Beitrag hilfreich. Es stellt den Unterschied zwischen Thread.sleep()
, Thread.yield()
und Object.wait()
in menschlicher Hinsicht. Zu zitieren:
Es macht alles schließlich seinen Weg nach unten an das Scheduler O, die austeilt Zeitscheiben zu Prozessen und Threads.
sleep(n)
sagt „Ich bin mit meinem Zeitrahmen erfüllt, und bitte mich nicht geben ein weiterer für mindestens n Millisekunden.“ Das Betriebssystem auch dann nicht versuchen, planen Sie den Schlaf Thread, bis die angeforderte Zeit vergangen ist.
yield()
sagt „Ich bin mit meinem Zeitrahmen erfüllt, aber ich habe noch Arbeit tun.“ Das Betriebssystem sofort frei ist, den Faden zu geben, eine andere Zeitscheibe, oder einen anderen Thread zu geben oder die CPU das Nachgeben Gewinde verarbeiten nur aufgab.
wait()
sagt „Ich habe mit meinem Zeitrahmen erfüllt bin. Gib mir nicht ein anderer Zeitscheibe, bis jemand anruft () benachrichtigen.“ Wie beisleep()
, das Betriebssystem wird nicht sogar versuchen, Ihre Aufgabe zu planen, es sei denn jemand anruftnotify()
(oder eine ein paar andere Wake-up-Szenarien auftreten).Themen auch den Rest ihrer Zeitscheibe verlieren, wenn sie durchführen IO und unter einigen anderen Umständen zu blockieren. Wenn ein Thread Werk durch die gesamte Zeitscheibe nimmt das O gewaltsam Steuerung grob als wenn
yield()
genannt worden ist, so dass andere Prozesse ausgeführt werden können.Sie müssen selten
yield()
, aber wenn Sie eine rechen schwere App mit logische Aufgabe Grenzen, einyield()
Einfügen Macht verbessern System Ansprechbarkeit (auf Kosten der Zeit - Kontextwechsel, auch nur um das Betriebssystem und zurück, ist nicht frei). Messen und Testen gegen Ziele, die Sie kümmern uns um, wie immer.
Es gibt viele Antworten hier, aber ich konnte die semantische Unterscheidung auf jedem erwähnten nicht gefunden.
Es geht nicht um den Faden selbst; beide Methoden erforderlich sind, da sie sehr unterschiedliche Anwendungsfälle unterstützen.
sleep()
sendet das Thema zu schlafen, wie es vorher war, ist es nur den Kontext packt und stoppt für eine vorgegebene Zeit ausgeführt wird. Also, um es zu wecken, bevor die zu gegebener Zeit auf, müssen Sie das Thema Bezug kennen. Dies ist nicht eine gemeinsame Situation in einer Multi-threaded Umgebung. Es ist vor allem für die Zeitsynchronisation (z wake in genau 3,5 Sekunden) und / oder hartcodierte Fairness (nur schlafen für eine Weile und lassen Sie andere Themen Arbeit).
wait()
, im Gegenteil, ist ein Thread (oder Nachricht) Synchronisations-Mechanismus, dass Sie ein Thema zu informieren, ermöglicht, von denen Sie keine gespeicherten Referenz haben (noch Pflege). Sie können als Publish-Subscribe-Muster (wait
== abonnieren und notify()
== veröffentlichen) daran denken. Grundsätzlich benachrichtigen () verwenden Sie eine Nachricht senden (das könnte sogar überhaupt nicht empfangen werden und in der Regel kümmert es dich nicht).
Um es zusammenzufassen, die Sie normalerweise sleep()
für zeit syncronization und wait()
für Multi-Thread-Synchronisation verwendet werden.
Sie könnten auf die gleiche Weise in dem zugrunde liegenden Betriebssystem, oder gar nicht umgesetzt werden (wie in früheren Versionen von Java keine wirkliche Multithreading hatte, wahrscheinlich einige kleine VMs tun nicht, dass entweder). Vergessen Sie nicht, Java läuft auf einer VM, so dass Ihr Code wird in etwas anderes nach dem VM / O / HW transformiert wird es läuft.
Hier habe ich einige wichtige Unterschiede zwischen wait()
und sleep()
Methoden aufgeführt.
PS:. Auch auf die Links klicken Bibliothekscode zu sehen (interne Arbeits, um ein wenig zum besseren Verständnis nur spielen)
wait ()
-
wait()
Methode löst die Verriegelung. -
wait()
ist die Methode derObject
Klasse. -
wait()
ist die nicht-statische Methode -public final void wait() throws InterruptedException { //...}
-
wait()
sollte durchnotify()
odernotifyAll()
Methoden informiert werden. -
wait()
Methode muss aus einer Schleife, um mit Fehlalarm zu behandeln genannt werden. -
wait()
Methode muss aus Synchron Kontext (d.h. synchronisierte Methode oder Block) bezeichnet werden, sonst wird esIllegalMonitorStateException
werfen
sleep ()
-
sleep()
Methode nicht die Sperre freigeben. -
sleep()
ist die Methode derjava.lang.Thread
Klasse. -
sleep()
ist die statische Methode -public static void sleep(long millis, int nanos) throws InterruptedException { //... }
- nach der angegebenen Menge an Zeit,
sleep()
ist abgeschlossen. -
sleep()
besser nicht von der Schleife zu nennen (d. siehe Code unten ). -
sleep()
können von überall aufgerufen werden. gibt es keine spezielle Anforderung.
Ref: Unterschied zwischen Warten und Schlaf
Code-Snippet für Warte und Schlaf-Methode aufrufen
synchronized(monitor){
while(condition == true){
monitor.wait() //releases monitor lock
}
Thread.sleep(100); //puts current thread on Sleep
}
Es gibt einige Unterschiede Keynotes i nach der Arbeit auf Warte und Schlaf schließen, zuerst einen Blick auf Probe nehmen Warte mit () und sleep ():
Example1 : mit warten () und Schlaf ():
synchronized(HandObject) {
while(isHandFree() == false) {
/* Hand is still busy on happy coding or something else, please wait */
HandObject.wait();
}
}
/* Get lock ^^, It is my turn, take a cup beer now */
while (beerIsAvailable() == false) {
/* Beer is still coming, not available, Hand still hold glass to get beer,
don't release hand to perform other task */
Thread.sleep(5000);
}
/* Enjoy my beer now ^^ */
drinkBeers();
/* I have drink enough, now hand can continue with other task: continue coding */
setHandFreeState(true);
synchronized(HandObject) {
HandObject.notifyAll();
}
Klarheit einige wichtige Hinweise Lassen Sie:
- Rufen Sie auf :
- wait (): Rufen Sie an aktuellen Thread, HandObject Object halten
- sleep (): Rufen Sie auf Thread ausführen Aufgabe Bier bekommen (ist Klassenmethode so auf laufenden Faden beeinflussen)
- Synchronisierte :
- wait (): Wenn synchronisierte Multi-Thread Zugriff gleiches Objekt (HandObject) (Wenn die Kommunikation benötigt zwischen mehr als einem Thread (Thread ausgeführt Codierung, Thread ausgeführt Bier) Zugriff auf demselben Objekt HandObject erhalten)
- sleep (): wenn die Bedingung wartet ausführen, um fortzufahren (Waiting Bier verfügbar)
- Halten Schloss :
- wait (): die Sperre für anderes Objekt Chance hat, auszuführen (HandObject ist kostenlos, können Sie andere Job)
- sleep (): Sperre hält für mindestens t mal (oder bis Interrupt) (Meine Arbeit noch nicht fertig, ich bin halte Sperre fortsetzen und eine Bedingung warten, um fortzufahren)
- Wake-up-Zustand :
- wait (): bis Anruf notify (), notifyAll () von Objekt
- sleep (): bis mindestens Zeit abläuft oder rufen Sie Interrupt
- Und der letzte Punkt ist Verwendung, wenn als estani zeigen:
Sie normalerweise sleep () für zeit syncronization verwenden und warten () für Multi-Thread-Synchronisation.
Bitte korrigieren Sie mich, wenn ich falsch bin.
Der Unterschied zwischen wait () und sleep ()
-
Der grundlegende Unterschied besteht darin, dass aus
wait()
Object
undsleep()
ist eine statische Methode vonThread
. -
Der wesentliche Unterschied besteht darin, dass
wait()
die Sperre freigibt, währendsleep()
keine Sperre entbindet während des Wartens. -
wait()
für Inter-Thread-Kommunikation verwendet wird, währendsleep()
verwendet, um eine Pause bei der Ausführung einzuführen, in der Regel. -
wait()
sollte innerhalb aufgerufen werden aus synchronisieren oder sonst bekommen wir eineIllegalMonitorStateException
, währendsleep()
überall aufgerufen werden kann. - Um einen Faden wieder aus
wait()
zu starten, haben Sienotify()
odernotifyAll()
nennen. Wassleep(),
wird der Faden nach einem bestimmten Zeitintervall gestartet.
Similarities
- machen Sowohl der aktuelle Thread geht in den Nicht Runnable Zustand.
- Beide sind nativer Methoden.
Dies ist eine sehr einfache Frage, weil diese beiden Methoden eine ganz andere Verwendung haben.
Der große Unterschied ist, zu warten, um die Verriegelung zu lösen oder zu überwachen, während Schlaf keine Sperre entbindet oder Monitor während der Wartezeit. Warten für inter-thread-Kommunikation verwendet wird, während Schlaf verwendet wird Pause bei der Ausführung einzuführen.
Dies war nur eine klare und einfache Erklärung, wenn Sie mehr wollen als das, dann lesen Sie weiter.
Bei wait()
Methode Thread geht in Wartezustand und es wird nicht wieder automatisch, bis wir die notify()
Methode aufrufen (oder notifyAll()
, wenn Sie mehr als einen Thread im Wartebetrieb und Sie wollen all die Thread wecken) . Und Sie müssen synchronisiert oder Objektsperre oder Klassensperre die wait()
oder notify()
oder notifyAll()
Methoden zuzugreifen. Und noch eine Sache, die wait()
Methode für inter-thread Kommunikation verwendet wird, weil, wenn ein Thread sich in Wartestellung geht Sie einen anderen Thread brauchen diesen Thread zu wecken.
Aber im Falle von sleep()
ist dies ein Verfahren, das den Prozess für einige Sekunden oder die Zeit, die Sie wollte halten verwendet wird. Weil Sie müssen jede notify()
oder notifyAll()
Methode nicht provozieren, um diesen Thread zurück. Oder Sie brauchen keinen anderen Thread, Thread rufen Sie zurück. Wie, wenn Sie etwas wollen, nach wenigen Sekunden wie in einem Spiel nach Benutzer an der Reihe passieren soll, möchten Sie die Benutzer warten, bis der Computer spielt dann können Sie die sleep()
Methode nennen.
Und noch ein wichtiger Unterschied, der in Interviews oft gefragt wird: sleep()
gehört zur Klasse und Thread
wait()
gehören zur Klasse Object
Das sind die Unterschiede zwischen sleep()
und wait()
.
Und es gibt eine Ähnlichkeit zwischen den beiden Methoden. Sie beide Anweisung überprüft werden, so dass Sie fangen versuchen müssen oder wirft, um diese Methoden zugreifen
Ich hoffe, dies wird Ihnen helfen.
Quelle: http://www.jguru.com/faq/view. jsp? EID = 47127
Thread.sleep()
sendet den aktuellen Thread in den "Nicht Runnable" Zustand für gewisse Zeit. Das Gewinde hält die überwacht es aquired hat - das heißt, wenn der Faden wird derzeit in einem synchronisierten Block oder das Verfahren kein anderer Thread kann diesen Block oder Verfahren ein. Wenn ein anderer Thread ruftt.interrupt()
es wird der Schlaf Thread aufwachen.Beachten Sie, dass Schlaf eine statische Methode ist, was bedeutet, dass es immer beeinflusst der aktuelle Thread (die, die in den Schlaf Verfahren ausführen). EIN häufiger Fehler ist
t.sleep()
zu nennen, wo t ein anderer Thread ist; selbst dann, es ist der aktuelle Thread, schläft, nicht der t-Thread.
t.suspend()
ist veraltet. Mit ihm ist möglich, einen anderen Thread zu beenden als der aktuelle Thread. Ein Thread suspendiert hält all seinen Monitoren und da dieser Zustand nicht unterbrechbare ist es anfällig ist Deadlock.
object.wait()
sendet den aktuellen Thread in den "Nicht Runnable" Zustand, wiesleep()
, aber mit einem Twist. Warten auf einem Objekt aufgerufen, keine Faden; wir nennen das Objekt des „Sperrobjekt.“ Vorlock.wait()
ist genannt wird, muß der aktuelle Thread auf dem Sperrobjekt synchronisieren;wait()
gibt dann diese Sperre, und fügt den Faden auf die „Warteliste“ mit dem Schloß verbunden. Später kann ein anderer Thread auf die Synchronisierungs gleiches Sperrobjekt und Calllock.notify()
. Dies weckt die Original-up, Warte Faden. Grundsätzlichwait()
/notify()
ist wiesleep()
/interrupt()
, nur der aktive Thread braucht keinen direkten Zeiger auf den schlafenden Thread, aber nur in dem gemeinsam genutzten Verriegelungsobjekt.
Warten und Schlaf sind zwei verschiedene Dinge:
- In
sleep()
der Faden hält für die angegebene Dauer zu arbeiten. - In
wait()
der Faden nicht mehr funktioniert, bis das Objekt gewartet-on wurde benachrichtigt wird, in der Regel von anderen Threads.
sleep
Verfahren zum Thread
ist, wait
ist ein Verfahren der Object
, so wait/notify
ist eine Technik des gemeinsam benutzte Daten in Java Synchronisieren (mit Monitor ), aber sleep
ein einfaches Verfahren zum Faden selbst zu unterbrechen.
sleep () ist ein Verfahren, das den Prozess für einige Sekunden oder die Zeit, die Sie aber im Fall der Methode wait () Thread wollten halten verwendet wird, gehen in Wartezustand und es wird nicht kommen automatisch zurück, bis wir die notify () oder notifyAll () aufrufen.
Der Hauptunterschied ist, dass wait () gibt die Sperre oder überwachen, während sleep () keine Meldungen jede Sperre oder Monitor während der Wartezeit. Warten Sie werden verwendet, um inter-thread-Kommunikation während Schlaf verwendet wird Pause bei der Ausführung einzuführen, in der Regel.
Thread.sleep () sendet den aktuellen Thread in den „Nicht Runnable“ Zustand für eine bestimmte Zeitdauer. Das Gewinde hält die überwacht er erworben hat - das heißt, wenn der Thread zur Zeit in einem synchronisierten Block oder Methode ist kein anderer Thread diesen Block oder Methode eingeben. Wenn ein anderer Thread ruft t.interrupt () wird es den Schlaf Thread aufwachen. Man beachte, dass der Schlaf ist ein statisches Verfahren, was bedeutet, dass sie immer den aktuellen Thread betrifft (die eine, die die Schlaf-Methode ausgeführt wird). Ein häufiger Fehler ist t.sleep () aufzurufen, wobei t einem anderen Thread ist; selbst dann, es ist der aktuelle Thread, schläft, nicht der t-Thread.
Object.wait () sendet den aktuellen Thread in den „Nicht Runnable“ Zustand, wie Schlaf (), aber mit einem Twist. Warten auf einem Objekt aufgerufen, keinen Faden; Wir nennen dieses Objekt des „Sperrobjekt“. Bevor lock.wait () aufgerufen wird, der aktuelle Thread auf dem Sperrobjekt synchronisieren muß; wait () gibt dann diese Sperre, und fügt den Faden nach dem die Sperre zugeordnet „Warteliste“. Später kann ein anderer Thread auf dem gleichen Sperrobjekt synchronisieren und rufen lock.notify (). Dies weckt das Original, wartet Faden wieder auf. Grundsätzlich wait () / notify () ist wie Schlaf () / unterbrechen (), werden nur der aktive Thread keinen direkten Pointer auf das Schlaf Gewinde benötigt, sondern nur auf das freigegebene Sperrobjekt.
synchronized(LOCK) {
Thread.sleep(1000); // LOCK is held
}
synchronized(LOCK) {
LOCK.wait(); // LOCK is not held
}
Lassen Sie alle oben genannten Punkte kategorisieren:
Call on:
- wait (): Rufen Sie an einem Objekt; aktuelle Thread auf dem Sperrobjekt synchronisieren muß.
- sleep (): Rufen Sie auf einem Thema; immer zur Zeit Thread ausgeführt wird.
Synchronized:
- wait ():. , wenn mehrere Threads zugreifen gleichen Objekt nacheinander synchronisiert
- sleep (.): , wenn mehrere Threads synchronisiert warten Schlaf über Gewinde des Schlafens
Hold lock:
- wait ():. die Sperre für andere Objekte Chance zu haben, auszuführen
- sleep ():. halte Sperre für mindestens t mal wenn Timeout angegeben oder jemand unterbrechen
Wake-up condition:
- wait (): , bis der Anruf notify (), notifyAll () von Objekt
- sleep ():. , bis zumindest die Zeit ungültig oder rufen Sie Interrupt ()
Usage:
- sleep (): für Zeitsynchronisation und;
- wait (): für Multi-Thread-Synchronisation .
Ref: diff sleep
und wait
wait
und sleep
Methoden sind sehr unterschiedlich:
-
sleep
hat keine Möglichkeit, „Aufwecken“, -
wait
hat eine Art „Aufwecken“ während der Wartezeit von einem anderen Thread aufrufennotify
odernotifyAll
.
Kommen Sie darüber nachdenken, werden die Namen in dieser Hinsicht sind verwirrend; jedoch sleep
ist ein Standardname und wait
ist wie die WaitForSingleObject
oder WaitForMultipleObjects
in dem Win-API.
In einfachen Worten, Warten warten, bis ein anderer Thread Sie ruft während des Schlafes „nicht nächste Anweisung ausführen“ für einige bestimmten Zeitraum.
Außerdem Schlaf statische Methode in Thread-Klasse und arbeitet auf Faden, während wait () in Objektklasse ist und auf einem Objekt bezeichnet wird.
Ein weiterer Punkt, wenn Sie warten auf einen Gegenstand nennen, beteiligt der Thread synchronisieren Sie das Objekt und dann wartet. :)
Von diesem Beitrag: http://javaconceptoftheday.com / Differenz zwischen-wait-and-Schlaf-Methoden-in-java /
wait () Methode.
1) Der Faden, die Wartezeit ruft () Methode gibt die Sperre sie hält.
2) Der Faden gewinnt die Sperre nach dem anderen Threads rufen entweder benachrichtigen () oder notifyAll () Verfahren auf der gleichen Sperre.
3) Warten () Methode muss innerhalb des synchronisierten Block bezeichnet werden.
4) warten () -Methode immer auf Objekte aufgerufen wird.
5) Wartefäden können durch andere Threads aufgeweckt werden durch benachrichtigen () aufrufen oder notifyAll () Methoden.
6), wait () Methode aufzurufen, müssen Thread Objektsperre haben.
sleep () Methode
1) Der Faden, der sleep () Methode aufruft lüftet nicht das Schloss es hält.
2) sleep () Methode kann innerhalb oder außerhalb des synchronisierten Block bezeichnet werden.
3) sleep () Methode immer auf Threads aufgerufen wird.
4) Sleeping Threads kann nicht von anderen Threads aufgeweckt werden. Wenn dies getan, Thread InterruptedException werfen.
5) zu nennen, sleep () Methode, Faden braucht nicht Objektsperre zu haben.
-
wait()
ist eine Methode derObject
Klasse.
sleep()
ist eine Methode derThread
Klasse. -
sleep()
erlaubt es dem Thread zu gehen Zustand für x Millisekundensleep
.
Wenn ein Thread geht in den Schlafzustandit doesn’t release the lock
. -
wait()
erlaubt Thread die Sperre undgoes to suspended state
zu lösen.
Dieser Thread ist aktiv, wenn eine odernotify()
notifAll()
Methode ist genannt für das gleiche Objekt.
Ein möglicher großer Unterschied zwischen Schlaf / unterbrechen und warten / benachrichtigen ist, dass
-
interrupt()
währendsleep()
immer löst eine Ausnahme (zB InterruptedException ) , während -
notify()
währendwait()
nicht.
eine Ausnahme zu erzeugen, wenn nicht ineffizient erforderlich ist. Wenn Sie Threads mit einer hohen Rate, die miteinander kommunizieren, dann wäre es eine Menge Ausnahmen zu erzeugen, wenn Sie Interrupt ganze Zeit fordert, die eine völlige Verschwendung von CPU ist.
Sie sind richtig - Sleep () führt dazu, dass Thread andere Threads zu „Schlaf“ und die CPU erlischt und Prozess (auch als Kontextwechsel bekannt) wheras Ich glaube, warten, bis die CPU die Verarbeitung des aktuellen Thread hält
.Wir haben beide denn obwohl es sinnvoll erscheint, können andere Leute die CPU verwenden zu lassen, während Sie es nicht verwenden, actualy ein Overhead Zusammenhang gibt es Schalt - je nachdem, wie lange der Schlaf ist für, kann es teurer sein in CPU-Zyklen, Threads zu wechseln, als es einfach ist beschränkt auf deinen Thread nichts für ein paar ms tun.
Beachten Sie auch, dass der Schlaf ein Kontextschalter drückt.
Auch - in der Regel ist es nicht möglich, Kontextwechsel zu steuern - während die das Betriebssystem warten kann (und wird für längere Wartezeiten) wählt andere Threads zu verarbeiten
.Die verwendeten Methoden sind für verschiedene Dinge.
Thread.sleep(5000); // Wait until the time has passed.
Object.wait(); // Wait until some other thread tells me to wake up.
Thread.sleep (n) können unterbrochen werden, aber Object.wait () muss benachrichtigt.
Es ist möglich, die maximale Zeit angeben, zu warten. Object.wait(5000)
so wäre es möglich, wait
zu, äh, sleep
zu verwenden, aber dann muss man mit Schlössern stören
Keine der Methoden verwendet die CPU während des Schlafes / warten.
Die Methoden sind implementiert nativen Code, ähnliche Konstrukte verwenden, aber nicht in der gleichen Art und Weise.
Sehen Sie selbst: Ist der Quellcode von nativen Methoden zur Verfügung? die Datei /src/share/vm/prims/jvm.cpp
ist der Ausgangspunkt ...
Hier wait () im Wartezustand sein wird, bis es von einem anderen Thread mitteilen, aber wo, wie sleep () wird einige time..after werden muss, dass es in den Bereitschaftszustand automatisch übertragen wird ...
Wait () und sleep () Unterschiede?
Thread.sleep () Nach Abschluss der Arbeit seiner Veröffentlichung dann nur die Sperre für alle. bis seine nie die Sperre für jedes freigeben.
Sleep() take the key, its never release the key to anyone, when its work completed then only its release then only take the key waiting stage threads.
Object.wait () Wenn sein zu warten Bühne geht, wird sie den Schlüssel und seine Warte für einige der auf der Grundlage des Parameter Sekunden lösen sein.
Beispiel:
Sie nehmen sind die Kaffee in deiner rechten Hand, können Sie ein anderes jemand von der gleichen Hand nehmen, wenn Sie Ihre setzen wird dann nur ein anderes Objekt gleichen Typs hier. ebenfalls. dies ist sleep () Sie schlafen Zeit, die Sie keine Arbeit haben, tun Sie nur schlafen .. hier gilt das gleiche auch.
wait (). wenn Sie setzen nach unten und nehmen Sie ein anderes bedeuten, während Sie warten, das ist warten
Sie spielt Film oder irgendetwas in Ihrem System gleich wie Spieler sind Sie nicht mehr als ein zu einer Zeit richtig spielen können, das sind seine hier, wenn Sie in der Nähe und wählen Sie ein anderes jemand Film oder Song bedeuten, während genannte Wartezeit wird
wait
die Sperre und sleep
nicht. Ein Thread sich in Wartestellung ist, die für das Aufwachen, sobald notify
oder notifyAll
genannt wird. Aber im Fall von sleep
des Faden hält das Schloss und es wird nur dann förderfähig, wenn die Ruhezeit ist vorbei.
sleep()
Verfahren bewirkt, dass der aktuellen Thread vom Fahrzustand zu bewegen Zustand für eine bestimmte Zeit zu blockieren. Wenn der aktuelle Thread die Sperre eines Objekts hat dann hält sie es hält, was bedeutet, dass eine beliebige andere Threads synchronisiert Verfahren in dieser Klasse Objekt nicht ausführen kann.
wait()
Verfahren bewirkt, dass der aktuellen Thread in Blockzustand gehen, entweder für eine bestimmte Zeit oder bis benachrichtigen, aber in diesem Fall gibt den Thread die Sperre des Objekts (was bedeutet, dass andere Threads keine synchronisierten Methoden des anrufenden Objekts ausführen können .
Meiner Meinung nach ist der Hauptunterschied zwischen den beiden Mechanismen ist, dass der Schlaf / Interrupt wird die grundlegendste Art und Weise Fäden der Handhabung, während warten / notify ist eine Abstraktion Ziel zu erleichtern die gegenseitige Kommunikation zu tun fädeln. Dies bedeutet, dass der Schlaf / Interrupt alles tun kann, sondern dass diese spezifische Aufgabe schwieriger ist, zu tun.
Warum warten / notify besser geeignet? Hier sind einige persönliche Überlegungen:
-
Es erzwingt Zentralisierung. Es ermöglicht die Kommunikation zwischen einer Gruppe von Fäden mit einem einzelnen gemeinsamen Objekt zu koordinieren. Dies erleichtert die Arbeit sehr.
-
Es erzwingt die Synchronisation. Weil es der Programmierer macht den Anruf wickelt in einem synchronisierten Block zu warten / benachrichtigen.
-
Es ist unabhängig von der Faden Herkunft und Zahl. Mit diesem Ansatz können Sie mehr Threads beliebig hinzugefügt werden, ohne die anderen Threads zu bearbeiten oder eine Übersicht über die bestehenden zu halten. Wenn Sie schlafen verwendet / unterbrechen, zuerst würden Sie die Verweise auf die Schlaf Fäden halten müssen, und ihnen dann eine Unterbrechung durch einen, von Hand.
Ein Beispiel aus dem wirklichen Leben, das gut ist zu erklären, das ein klassisches Restaurant ist und die Methode, die das Personal unter ihnen zu kommunizieren: Die Kellner die Kundenwunsch in einem zentralen Ort zu verlassen (eine Kork-Board, ein Tisch, etc eine Glocke, und die Arbeiter aus der Küche.), kommen klingelt solche Anfragen zu nehmen. Einmal, dass jeder Kurs fertig ist, läutet das Küchenpersonal die Glocke wieder, so dass die Kellner bewusst sind, und nehmen sie an den Kunden.
Beispiel über den Schlaf entbindet nicht Sperre und warten tut
Hier gibt es zwei Klassen:
- Haupt :. Enthält Hauptmethode und zwei Threads
-
Singleton . Dies ist Singletonklasse mit zwei statischen Methoden getInstance () und getInstance (boolean isWait)
public class Main { private static Singleton singletonA = null; private static Singleton singletonB = null; public static void main(String[] args) throws InterruptedException { Thread threadA = new Thread() { @Override public void run() { singletonA = Singleton.getInstance(true); } }; Thread threadB = new Thread() { @Override public void run() { singletonB = Singleton.getInstance(); while (singletonA == null) { System.out.println("SingletonA still null"); } if (singletonA == singletonB) { System.out.println("Both singleton are same"); } else { System.out.println("Both singleton are not same"); } } }; threadA.start(); threadB.start(); } }
und
public class Singleton {
private static Singleton _instance;
public static Singleton getInstance() {
if (_instance == null) {
synchronized (Singleton.class) {
if (_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
public static Singleton getInstance(boolean isWait) {
if (_instance == null) {
synchronized (Singleton.class) {
if (_instance == null) {
if (isWait) {
try {
// Singleton.class.wait(500);//Using wait
Thread.sleep(500);// Using Sleep
System.out.println("_instance :"
+ String.valueOf(_instance));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
_instance = new Singleton();
}
}
}
return _instance;
}
}
Jetzt dieses Beispiel auszuführen Sie unter Ausgabe:
_instance :null
Both singleton are same
Hier Singleton-Instanzen erstellt von ThreadA und ThreadB sind gleich. Es bedeutet ThreadB außerhalb bis ThreadA Release wartet es zu sperren.
Sie nun die Singleton.java ändern, indem Kommentierung Thread.sleep (500); Verfahren und Auskommentierung Singleton.class.wait (500); . Hier wegen Singleton.class.wait (500); Verfahren ThreadA wird lösen alle Schlösser und bewegt sich in den „Non Runnable“ Zustand zu erwerben, wird ThreadB erhalten ändern in synchronisierten Block eingeben.
Jetzt läuft wieder:
SingletonA still null
SingletonA still null
SingletonA still null
_instance :com.omt.sleepwait.Singleton@10c042ab
SingletonA still null
SingletonA still null
SingletonA still null
Both singleton are not same
Hier Singleton Instanzen von ThreadA und ThreadB erstellt wird, sind nicht gleich, weil der ThreadB ändern konnte in synchronisierten Block und nach 500 Millisekunden eingeben ThreadA begann aus der letzten Position ist und erstellt ein weiteres Singleton-Objekt.
Sollte aus synchronisierten Block aufgerufen werden: wait()
Methode aufgerufen wird immer von synchronisierten Block heißen wait()
Methode muss Objekt Monitor sperrt, bevor Objekt, auf das sie aufgerufen wird. Aber sleep()
Methode kann von außen synchronisierten Block heißt sleep()
Methode aufgerufen wird keinen Objekt-Monitor benötigen.
IllegalMonitorStateException:. , wenn wait()
Verfahren ohne den Erwerb Objektsperre als IllegalMonitorStateException
aufgerufen wird, wird zur Laufzeit geworfen, aber sleep()
Methode löst nie eine solche Ausnahme
gehört zu der Klasse. wait()
Methode gehört zur Klasse aber java.lang.Object
Methode sleep()
gehört zur Klasse java.lang.Thread
aufgerufen, auf dem Objekt oder Thread:. wait()
Methode auf Objekte aufgerufen wird aber sleep()
Methode basiert auf Threads nicht Objekte genannt
Themen-Zustand: , wenn wait()
Methode auf dem Objekt aufgerufen wird, Thread, holded Objekts Monitor Zustand vom Laufen zu warten, geht und kann auf runnable Zustand zurück, nur wenn notify()
oder notifyAll()
Methode für das Objekt aufgerufen wird. Und später Thread-Scheduler Zeitplan, der Thread zu gehen aus von runnable zu Zustand ausgeführt wird.
wenn sleep()
auf Thread aufgerufen wird, geht es vom Laufen auf Wartezustand und zu runnable Zustand zurückkehren kann, wenn der Schlaf Zeit abgelaufen ist.
Wenn aus Synchronblock genannt: , wenn wait()
Verfahren Thread aufgerufen wird, verlässt die Objektsperre. Aber sleep()
Methode, wenn sie von synchronisierten Block oder eine Methode Thread aufgerufen nicht Blätter Sperrobjekt.
Mehr Referenz
Von der Oracle-Dokumentation Seite auf warten () Methode Object
:
public final void wait()
- Bewirkt, dass der aktuelle Thread warten, bis ein anderer Thread die
notify()
-Methode oder dienotifyAll()
Methode für dieses Objekt aufruft. Mit anderen Worten verhält sich diese Methode genau, als ob es den Anruf einfachwait(0)
führt. - Der aktuelle Thread muss dieses Objekt Monitor besitzen. Der Thread Meldungen Eigentum an diesen Monitor und wartet, bis ein anderer Thread benachrichtigt Threads zu diesem Objekt Monitor wartet aufwachen
- Interrupts und unechte Wakeups sind möglich
- Diese Methode sollte nur von einem Thread aufgerufen werden, der Besitzer dieses Objekts Monitor
Dieses Verfahren wirft
-
IllegalMonitorStateException
-., Wenn der aktuelle Thread Monitor nicht der Eigentümer des Objekts -
InterruptedException
- wenn ein Thread den aktuellen Thread vor oder während der aktuelle Thread unterbrochen wurde für eine Benachrichtigung warten. Der unterbrochene Zustand des aktuellen Threads gelöscht, wenn diese Ausnahme ausgelöst wird.
Von der Oracle-Dokumentation Seite auf sleep () Methode der Thread
Klasse:
public static void sleep(long millis)
- Ursachen der aktuell ausgeführten Thread (vorübergehend aufhören Ausführung) für die angegebene Anzahl von Millisekunden zu schlafen, vorbehaltlich der Präzision und Genauigkeit der System-Timer und Disponenten.
- Der Faden nicht das Eigentum an allen Monitoren verlieren.
Diese Methode führt:
-
IllegalArgumentException
- wenn der Wert von Millis negativ -
InterruptedException
- wenn ein Thread den aktuellen Thread unterbrochen hat. Der unterbrochene Zustand des aktuellen Threads gelöscht, wenn diese Ausnahme ausgelöst wird.
Weiterer wichtiger Unterschied:
wait()
ist eine nicht statische Methode (instance Verfahren) Im Gegensatz zu statischen Verfahren sleep()
(class-Verfahren).
wait()
ist innerhalb eines synchronisierten Verfahren gegeben
während sleep()
ist in einem nicht synchronisierten Verfahren gegeben, weil wait()
Methode für das Objekt das Schloss freizugeben, aber sleep()
oder yield()
die lock()
entbindet.
mit einem Timeout-Wert wartet auf Timeout-Wert verstrichene Wakeup oder benachrichtigen je nachdem was früher ist (oder auch unterbrechen), während ein Schlaf auf Timeout-Wert aufwacht verstrichen oder Interrupt je nachdem, was früher eintritt. wait () ohne Timeout-Wert wird für immer warten, bis benachrichtigt oder unterbrochen
- Die Methode
wait(1000)
den aktuellen Thread führt zu schlafen bis zu einer Sekunde .- Ein Thread konnte schlafen weniger als 1 Sekunde, wenn es die
notify()
odernotifyAll()
Methodenaufruf.
- Ein Thread konnte schlafen weniger als 1 Sekunde, wenn es die
- Der Aufruf von
Lizenziert unter: CC-BY-SA mit ZuschreibungNicht verbunden mit StackOverflow