sleep()與wait() yield()的區別

2021-09-14 05:18:25 字數 1278 閱讀 3154

sleep()是使執行緒暫停執行一段時間的方法。wait()也是一種使執行緒暫停執行的方法,例如,當執行緒互動時,如果執行緒對乙個同步物件x發出乙個wait()呼叫請求,那麼該執行緒會暫停執行,被調物件進入等待狀態,直到被喚醒或等待時間超時。

二者的區別主要為以下幾點:

(1)原理不同。

sleep()方法是thread類的靜態方法,是執行緒用來控制自身流程的,會使此執行緒暫停執行一段時間,把執行機會讓給其他執行緒,等時間一到此執行緒會自動「甦醒」。

wait()方法是object()類的方法,用於執行緒間的通訊,這個方法會使當前擁有該物件鎖的程序等待,直到其他執行緒呼叫notify()方法(或notifyall()方法)才「甦醒」。

(2)對鎖的處理機制不同

sleep()方法的主要作用是讓執行緒暫停執行一段時間,時間一到自動恢復,不涉及執行緒間的通訊,因此呼叫sleep()方法並不會釋放鎖。

呼叫wait()方法後,執行緒會釋放掉它所占用的鎖,從而使執行緒所在物件中的其他synchronized資料可被別的執行緒使用。

(3)使用區域不同

sleep()方法可以放在任何地方使用。

wait()方法必須放在同步控制方法或同步語句塊中使用。

(4)異常捕獲

sleep方法必須捕獲異常,在sleep過程中,有可能被其他物件呼叫它的interrupt()產生interruptexception異常。

wait()、notify()、notifyall()不需要捕獲異常

由於sleep不會釋放「鎖標誌」,容易導致死鎖。因此一般推薦使用wait()方法

(1)優先順序

sleep()方法執行時不考慮執行緒優先順序,因此會給低優先順序的執行緒執行的機會;

yield()方法只會給相同優先順序或更高優先順序的執行緒以執行的機會

(2)狀態

執行緒執行sleep()方法後會轉入阻塞狀態,所以執行sleep()方法的執行緒在指定的時間內不會被執行。

yield()方法使當前執行緒重回到可執行狀態,所以執行yield()方法的執行緒有可能在進圖到可執行狀態後又馬上被執行。

(3)異常

sleep()方法生命丟擲interruptexception,而yield()方法沒有宣告任何異常

(4)可操作性

sleep()方法比yield()方法(跟作業系統相關)具有更好的移植性。

sleep與wait的區別

sleep與wait的區別 1.都是執行緒狀態切換的操作 2.sleep一定時間後會自動喚醒,wait則需要手動notify或notifyall 3.sleep不會釋放物件鎖,thread方法 wait會放棄物件鎖,是object方法,執行後會進入等待物件鎖池的佇列中 4.notify並不會釋放鎖,...

sleep與wait的區別

sleep 就是正在執行的執行緒主動讓出 cpu,cpu 去執行其他執行緒,在 sleep 指定的時間過後,cpu 才會回到這個執行緒上繼續往下執行,如果當前執行緒進入了同步鎖,sleep 方法並不會釋 放鎖,即使當前執行緒使用 sleep 方法讓出了 cpu,但其他被同步鎖擋住了的執行緒也無 法得...

sleep()與wait()的區別

sleep,wait如例子 店 public class 店 消費麵包 public void take public boolean isempety public boolean isfull 生產者 public class 生產者 implements runnable override p...