sleep 的源碼: pub1ic class Thread imp1 ements Runnable { //native 表示調用操作系統底層實現的方法 pub1ic static native void sleep(1ong millis) throws InterruptedExceptio ...
sleep 的源碼:
pub1ic class Thread imp1 ements Runnable {wait 的源碼:
//native 表示調用操作系統底層實現的方法 pub1ic static native void sleep(1ong millis) throws InterruptedException ; pub1ic static void s1eep(1ong millis, int nanos) throws InterruptedException { if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0|I nanos > 999999) { throw new Il1egalArgumentExcepti on( "nanosecond timeout value out of range"); } if (nanos >= 500000 II (nanos != 0 && millis == 0)) { milliS++; } sleep(mi1lis); } //... }
public class Object { public final native void wait(long timeout) throws InterruptedException; public final void wait(long timeout, int nanos) throws InterruptedException { if (timeout < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos > 0) { timeout++; } wait(timeout); } //... }區別: 1、 sleep 來自 Thread 類,和 wait 來自 Object 類。 2、最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。 3、wait,notify和 notifyAll 只能在同步控制方法或者同步控制塊裡面使用,而 sleep 可以在任何地方使用(使用範圍) 4、 sleep 必須捕獲異常,而 wait , notify 和 notifyAll 不需要捕獲異常 (1) sleep 方法屬於 Thread 類中方法,表示讓一個線程進入睡眠狀態,等待一定的時間之後,自動醒來進入到可運行狀態,不會馬上進入運行狀態,因為線程調度機制恢複線程的運行也需要時間,一個線程對象調用了 sleep方法之後,並不會釋放他所持有的所有對象鎖,所以也就不會影響其他進程對象的運行。但在 sleep 的過程中過程中有可能被其他對象調用它的 interrupt() ,產生 InterruptedException 異常,如果你的程式不捕獲這個異常,線程就會異常終止,進入 TERMINATED 狀態,如果你的程式捕獲了這個異常,那麼程式就會繼續執行catch語句塊(可能還有 finally 語句塊)以及以後的代碼。 註意 sleep() 方法是一個靜態方法,也就是說他只對當前對象有效,通過 t.sleep() 讓t對象進入 sleep ,這樣的做法是錯誤的,它只會是使當前線程被 sleep 而不是 t 線程 (2) wait 屬於 Object 的成員方法,一旦一個對象調用了wait方法,必須要採用 notify() 和 notifyAll() 方法喚醒該進程;如果線程擁有某個或某些對象的同步鎖,那麼在調用了 wait() 後,這個線程就會釋放它持有的所有同步資源,而不限於這個被調用了 wait() 方法的對象。 wait() 方法也同樣會在 wait 的過程中有可能被其他對象調用 interrupt() 方法而產生異常 。