sleep 的原始碼:
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);
}
//...
}
區別:
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() 方法而產生例外 ,
start 與 run 區別:
1. start()方法來啟動執行緒,真正實作了多執行緒運行,這時無需等待 run 方法體代碼執行完畢,可以直接繼續執行下面的代碼, 2. 通過呼叫 Thread 類的 start()方法來啟動一個執行緒, 這時此執行緒是處于就緒狀態, 并沒有運行, 3. 方法 run()稱為執行緒體,它包含了要執行的這個執行緒的內容,執行緒就進入了運行狀態,開始運行 run 函式當中的代碼, Run 方法運行結束, 此執行緒終止,然后 CPU 再調度其它執行緒,這樣run()將作為一個普通方法立即執行,執行完畢前其他執行緒無法并發執行,轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/147229.html
標籤:Java
上一篇:Cloneable 介面實作原理
下一篇:陣列在記憶體中的分配
