所以sleep()和wait()方法的最大差異是:
##·sleep()睡眠時,保持物件鎖定,仍佔有該鎖定;
·而wait()睡眠時,釋放物件鎖定。
·但是wait()和sleep()都可以透過interrupt()方法打斷執行緒的暫停狀態,讓執行緒立刻拋出InterruptedException(但不建議使用該方法)。
/** * 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(); } }當threadTest.sleep2Seconds()時,輸出結果如下: 當threadTest.wait2Seconds()時,輸出結果如下: sleep2Seconds()/wait2Seconds()用secondMethod()表示:我們來大致分析一下此段程式碼,main()方法中實例化ThreadTest並啟動該線程,然後呼叫該線程的一個方法(secondMethod()),因為在主線程中調用方法,所以調用的普通方法secondMethod())會先被執行(但並不是普通方法執行完畢該對象的線程方法才執行,在普通方法執行過程中,該線程的方法也會被執行,他們是交替執行的,只是在主線程的普通方法會先被執行而已),所以程式運行時會先執行secondMethod(),而secondMethod ()方法程式碼片段中有synchronized block,因此secondMethod方法被執行後,該方法會佔有該物件機鎖定導致該物件的執行緒方法一直處於阻塞狀態,無法執行,直到secondeMethod釋放鎖定;使用Thread.sleep(2000)方法時,因為sleep在阻塞執行緒的同時,並持有該物件鎖定,所以該物件的其他同步執行緒(secondMethod())無法執行,直到synchronized block執行完畢(sleep休眠完畢) ,secondMethod()方法才可以執行,因此輸出結果為:
number*200+100;使用this.wait(2000)方法時,secondMethod()方法被執行後也鎖定了該物件的機鎖,執行到this .wait(2000)時,此方法會休眠2S並釋目前持有的鎖,此時該執行緒的同步方法會被執行(因為secondMethod所持有的鎖,已經被wait()所釋放),因此輸出的結果為:
number+100;
Java中sleep方法的幾個注意點:
1、Thread.sleep()方法用來暫停執行緒的執行,將CPU放給線程調度器。 2、Thread.sleep()方法是一個靜態方法,它暫停的是目前執行的執行緒。 3、Java有兩種sleep方法,一個只有一個毫秒參數,另一個有毫秒和奈秒兩個參數。 4、與wait方法不同,sleep方法不會釋放鎖定。 5、如果其他的執行緒中斷了一個休眠的線程,sleep方法會拋出Interrupted Exception。 6、休眠的執行緒在喚醒之後不保證能取得CPU,它會先進入就緒態,與其他執行緒競爭CPU。 7、有一個易錯的地方,當呼叫t.sleep()的時候,會暫停執行緒t。這是不對的,因為Thread.sleep是一個靜態方法,它會使當前執行緒而不是執行緒t進入休眠狀態。 8、wait方法必須正在同步環境下使用,例如synchronized方法或同步程式碼區塊。如果你不在同步條件下使用,會拋出IllegalMonitorStateException異常。另外,sleep方法不需要再同步條件下調用,你可以任意正常的使用。 9、wait方法用於和定義於Object類別的,而sleep方法操作於當前線程,定義在java.lang.Thread類別裡面。 PHP中文網,有大量免費的JAVA入門教學,歡迎大家學習!
以上是java wait和sleep的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!