Ich bin auf eine Frage gestoßen, bei der das Poster versucht hat, einen Thread eine Sekunde warten zu lassen. Sie verwendeten wait
, aber außerhalb eines synchronized
-Blocks und stürzten daher ab.
Bei einem laufenden Thread würde man die Ausführung für eine bestimmte Zeit unterbrechen:
%Vor%Dies sollte auch funktionieren und sehr ähnliche Ergebnisse haben:
%Vor% Mit dem Timeout wait
pausiert der Thread eine Sekunde später erneut.
Die Frage ist folgende: Wenn ich kein Problem mit der Überwachung und Benachrichtigung habe, gibt es einen tatsächlichen Grund, einen über den anderen zu verwenden?
Sowohl sleep()
als auch wait()
werden verwendet, um den aktuellen Thread zu halten, sie wurden jedoch für verschiedene Anwendungsfälle entworfen:
sleep()
wird normalerweise verwendet, wenn Sie genau wissen, wie lange Ihr Thread inaktiv sein soll. Nach dem angegebenen Timeout wird es automatisch aktiviert, ohne Störungen von außen. Es besteht immer noch die Möglichkeit, dass sich jemand dafür entscheidet, den Thread früher zu aktivieren, wenn etwas Dringendes passiert (in diesem Fall endet der Aufruf von sleep()
mit einem InterruptedException
). Zum Beispiel hat der Benutzer entschieden, die Anwendung zu schließen, wenn der Thread eingeschlafen ist, oder so ähnlich.
Also, sleep()
ist wie das Einstellen eines Weckers, der Sie in einer Stunde aufweckt, während Sie dösen. Aber jemand kann dich früher aufwecken, um zu sagen, dass das Gebäude brennt und es besser ist aufzustehen und etwas dagegen zu tun.
wait()
andererseits ist so ausgelegt, dass ein Thread auf Eis gelegt wird, bis irgendwann in der Zukunft etwas passiert. Du weißt nicht, wie lange es dauern wird. Es muss jemand außerhalb sein, der den Thread aufweckt, indem er notify()
oder notifyAll()
auf dem Monitor aufruft (auf demselben Objekt, das zum Aufrufen von wait()
verwendet wurde). Zum Beispiel hat ein Thread einen Job an einen anderen Thread delegiert und möchte schlafen, bis der Job erledigt ist. Sie haben auch die Möglichkeit, die Wartezeit zu begrenzen, aber der Thread wird die Ausführung nicht fortsetzen, bis er den Monitor wiedererlangen kann. Der wartende Thread kann noch genauso unterbrochen werden wie mit dem sleep()
.
Also, wait()
ist so, als hätten Sie den einzigen Schraubenzieher in der Werkstatt, leihen Sie ihn Ihrem Kollegen für eine Weile und beschließen, ein wenig zu dösen, bis er oder sie fertig ist. Sie bitten sie, Sie aufzuwecken, wenn Ihr Schraubenzieher wieder frei ist und Sie Ihre Arbeit fortsetzen können. Sie können auch einen Wecker wie in sleep()
einstellen, aber Sie werden nicht in der Lage sein, zur Arbeit zurückzukehren, bis Sie Ihren Schraubenzieher zurückbekommen.
Natürlich sind das nur die üblichen einfachen Ansätze, die Methoden zu verwenden. Sie können Ihre eigenen Nutzungsszenarien basierend auf deren Funktionalität erstellen.
Der Unterschied ist ziemlich klar in javadoc :
void Object.wait()
: Bewirkt, dass der aktuelle Thread wartet, bis ein anderer Thread die Methodenotify()
oder die MethodenotifyAll()
für dieses Objekt aufruft.
void Object.wait(long timeout)
: Bewirkt, dass der aktuelle Thread wartet, bis ein anderer Thread die Methodenotify()
oder die MethodenotifyAll()
für dieses Objekt aufruft oder eine bestimmte Zeitspanne abgelaufen ist.
static void Thread.sleep(long millis)
: Bewirkt, dass der aktuell ausgeführte Thread für die angegebene Anzahl von Millisekunden in den Ruhezustand versetzt wird (zeitweise wird die Ausführung gestoppt), abhängig von der Genauigkeit und Genauigkeit der Systemzeitgeber und -planer.
Andernfalls wird die Frage gestellt und eine erklärende Antwort erhalten hier .
Tags und Links java multithreading