Heim >Java >javaLernprogramm >Was ist der Unterschied zwischen Java Wait und Sleep?
Der größte Unterschied zwischen den Methoden „sleep()“ und „wait()“ ist also:
·Wenn sleep() schläft, bleibt die Objektsperre erhalten und die Sperre ist weiterhin belegt;
·Aber sowohl wait() als auch sleep() können den Pausenzustand des Threads über die Methode interrupt() unterbrechen, wodurch der Thread sofort eine InterruptedException auslöst (Diese Methode wird jedoch nicht empfohlen).
/** * Created by jiankunking on 2018/4/5. */ public class ThreadTest implements Runnable { int number = 10; public void addHundred() throws Exception { System.out.println("addHundred begin"); synchronized (this) { number += 100; System.out.println("addHundred:" + number); } System.out.println("addHundred end"); } public void wait2Seconds() throws Exception { System.out.println("wait2Seconds begin "); synchronized (this) { /** * (休息2S,阻塞线程) * 以验证当前线程对象的机锁被占用时, * 是否被可以访问其他同步代码块 */ System.out.println(".............wait begin.................."); this.wait(2000); number *= 200; System.out.println(".............wait end.................."); } System.out.println("wait2Seconds end "); } public void sleep2Seconds() throws Exception { System.out.println("sleep2Seconds begin "); synchronized (this) { /** * (休息2S,阻塞线程) * 以验证当前线程对象的机锁被占用时, * 是否被可以访问其他同步代码块 */ System.out.println("............sleep begin..................."); Thread.sleep(2000); number *= 200; System.out.println(".............sleep end.................."); } System.out.println("sleep2Seconds end "); } @Override public void run() { try { addHundred(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { ThreadTest threadTest = new ThreadTest(); Thread thread = new Thread(threadTest); thread.start(); //threadTest.sleep2Seconds(); //threadTest.wait2Seconds(); } }
Bei threadTest.sleep2Seconds() lautet das Ausgabeergebnis wie folgt:
Bei threadTest.wait2Seconds() lautet das Ausgabeergebnis wie folgt: sleep2Seconds()/wait2Seconds() wird durch secondMethod() dargestellt: Lassen Sie uns diesen Code kurz analysieren, ThreadTest in der main()-Methode instanziieren und Starten Sie den Thread und rufen Sie dann eine Methode (secondMethod()) des Threads auf. Da die Methode im Hauptthread aufgerufen wird, wird die aufgerufene gewöhnliche Methode secondMethod() zuerst ausgeführt (es handelt sich jedoch nicht um die Thread-Methode des Threads). Objekt, das die Ausführung der gewöhnlichen Methode beendet. Während der Ausführung der gewöhnlichen Methoden werden auch die Methoden des Threads abwechselnd ausgeführt, mit der Ausnahme, dass die gewöhnlichen Methoden im Hauptthread zuerst ausgeführt werden Während das Programm ausgeführt wird, wird secondMethod() zuerst ausgeführt, und secondMethod Es gibt einen synchronisierten Block im ()-Methodencodefragment, sodass die Methode nach Ausführung der secondMethod-Methode die Maschinensperre des Objekts belegt, wodurch die Thread-Methode des Objekts ausgeführt wird blockiert werden und kann nicht ausgeführt werden, bis secondeMethod die Sperre aufhebt;Bei Verwendung der Thread.sleep(2000)-Methode werden andere synchronisierte Threads (secondMethod()) blockiert, da Sleep den Thread blockiert und die Objektsperre aufrechterhält Das Objekt kann erst ausgeführt werden, wenn der synchronisierte Block ausgeführt wird (der Ruhezustand ist abgeschlossen). Die Methode secondMethod() kann ausgeführt werden, daher lautet das Ausgabeergebnis:
number*200+100;
Bei Verwendung der Methode this.wait(2000) wird die Methode secondMethod ()-Methode sperrt nach der Ausführung auch die Maschinensperre des Objekts und führt diese .wait(2000) aus. Die Methode wird 2 Sekunden lang in den Ruhezustand versetzt und die aktuell gehaltene Sperre freigegeben. Zu diesem Zeitpunkt wird die Synchronisierungsmethode des Threads aktiviert ausgeführt (da die von secondMethod gehaltene Sperre von wait() aufgehoben wurde), also die Ausgabe Das Ergebnis ist:
number+100;Mehrere Punkte, die Sie zur Sleep-Methode in Java beachten sollten:
1. Die Methode Thread.sleep() wird verwendet, um die Ausführung des Threads anzuhalten und die CPU an den Thread-Scheduler zu übergeben.
2. Die Thread.sleep()-Methode ist eine statische Methode, die den aktuell ausgeführten Thread anhält. 3. Java verfügt über zwei Schlafmethoden, eine hat nur einen Millisekundenparameter und die andere hat zwei Parameter, Millisekunden und Nanosekunden.
4. Im Gegensatz zur Wartemethode hebt die Schlafmethode die Sperre nicht auf.
5. Wenn andere Threads einen schlafenden Thread unterbrechen, löst die Schlafmethode eine unterbrochene Ausnahme aus.
6. Es ist nicht garantiert, dass ein ruhender Thread nach dem Aufwachen in den Bereitschaftszustand wechselt und mit anderen Threads um die CPU konkurriert.
7. Wenn t.sleep() aufgerufen wird, wird Thread t angehalten. Dies ist falsch, da Thread.sleep eine statische Methode ist, die den aktuellen Thread anstelle von Thread t in den Ruhezustand versetzt.
8. Die Wartemethode muss in einer synchronisierten Umgebung verwendet werden, beispielsweise einer synchronisierten Methode oder einem synchronisierten Codeblock. Wenn Sie es nicht unter synchronisierten Bedingungen verwenden, wird eine IllegalMonitorStateException ausgelöst. Darüber hinaus muss die Sleep-Methode nicht unter synchronen Bedingungen aufgerufen werden, sondern kann normal verwendet werden.
9. Die Wait-Methode wird in der Object-Klasse verwendet und definiert, während die Sleep-Methode für den aktuellen Thread ausgeführt wird und in der Klasse java.lang.Thread definiert ist.
Die chinesische PHP-Website bietet eine große Anzahl kostenloser
JAVA-Einführungs-Tutorials, die jeder gerne lernen kann!
Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen Java Wait und Sleep?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!