wait 和 sleep 的區別

sleep 的源碼:java

pub1ic class Thread imp1 ements Runnable {
   //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); } //... }
 
wait 的源碼:
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);
    }
    //...
}
 
區別:
  一、 sleep 來自 Thread 類,和 wait 來自 Object 類。
  二、最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其餘線程可使用同步控制塊或者方法。
  三、wait,notify和 notifyAll 只能在同步控制方法或者同步控制塊裏面使用,而 sleep 能夠在任何地方使用(使用範圍)
  四、 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() 方法而產生異常 。
相關文章
相關標籤/搜索