[JAVA靈魂10問]關於sleep與wait的思考

[JAVA靈魂10問]關於sleep與wait的思考

[JAVA靈魂10問]訪問權限的拷問:你懂的怎麼使用clone嗎
[JAVA靈魂10問]你知道java的重寫嗎?

寫在前面的話

一說到sleep和wait的區別,最先想到是的
1.時間 sleep可以設置時間,wait一般不設置時間需要喚醒
2.對象鎖 sleep不釋放對象鎖,而wait釋放對象鎖

sleep和wait的核心區別

sleep方法是靜態的
** wait是成員方法**

sleep

關於sleep在java源碼中只有簡單的一句話

public static native void sleep(long millis) throws InterruptedException;

從這句話看到sleep是靜態的,
靜態方法和類型相關,和成員無關
所以說,sleep方法屬於誰調用就去休眠誰。
下面看這樣一段代碼

public class JavaSleep {
    public static void main(String[] args) throws Exception {
Thread t1 = new Thread();
t1.start;
t1.sleep(1000);
	}
}

這裏我們發出一個疑問,在這段代碼中休眠的是誰?
如果你能理解上面那句話,這裏就會知道,上面的那段sleep與t1沒有任何關係!
因爲t1是一個對象,而sleep又與對象無關。所以sleep不可能讓t1休眠。
那麼,這段代碼中的sleep讓誰休眠了?
這個sleep是讓當前正在執行的線程休眠,哪一個線程調用了sleep,休會休眠那個線程。
所以,這個sleep會讓main休眠

wait

public final void wait() throws InterruptedException {
        wait(0);
    }

wait並沒有用static修飾,所以wait是對象方法沒有對象有關。

public class JavaWait {
    public static void main(String[] args) throws Exception {
        Thread t2 = new Thread();
        t2.start;
        t2.wait;

所以這段代碼中的wait會讓t2去等待

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章