wait與sleep的區別

2021-09-29 12:23:55 字數 1352 閱讀 2212

執行緒wait()和sleep()的區別

共同點: 

1. 他們都是在多執行緒的環境下,都可以在程式的呼叫處阻塞指定的毫秒數,並返回。 

2. wait()和sleep()都可以通過interrupt()方法 打斷執行緒的暫停狀態 ,從而使執行緒立刻丟擲interruptedexception。 

如果執行緒a希望立即結束執行緒b,則可以對執行緒b對應的thread例項呼叫interrupt方法。如果此刻執行緒b正在wait/sleep /join,則執行緒b會立刻丟擲interruptedexception,在catch() {} 中直接return即可安全地結束執行緒。 

需要注意的是,interruptedexception是執行緒自己從內部丟擲的,並不是interrupt()方法丟擲的。對某一線程呼叫 interrupt()時,如果該執行緒正在執行普通的**,那麼該執行緒根本就不會丟擲interruptedexception。但是,一旦該執行緒進入到 wait()/sleep()/join()後,就會立刻丟擲interruptedexception 。 

不同點: 

1. thread類的方法:sleep(),yield()等 

object的方法:wait()和notify()等 

2. 每個物件都有乙個鎖來控制同步訪問。synchronized關鍵字可以和物件的鎖互動,來實現執行緒的同步。 

sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。 

3. wait,notify和notifyall只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用 

4. sleep必須捕獲異常,而wait,notify和notifyall不需要捕獲異常

所以sleep()和wait()方法的最大區別是:

sleep()睡眠時,保持物件鎖,仍然占有該鎖;

而wait()睡眠時,釋放物件鎖。

但是wait()和sleep()都可以通過interrupt()方法打斷執行緒的暫停狀態,從而使執行緒立刻丟擲interruptedexception(但不建議使用該方法)。

sleep()方法

sleep()使當前執行緒進入停滯狀態(阻塞當前執行緒),讓出cup的使用、目的是不讓當前執行緒獨自霸佔該程序所獲的cpu資源,以留一定時間給其他執行緒執行的機會;

sleep()是thread類的static(靜態)的方法;因此他不能改變物件的機鎖,所以當在乙個synchronized塊中呼叫sleep()方法是,執行緒雖然休眠了,但是物件的機鎖並木有被釋放,其他執行緒無法訪問這個物件(即使睡著也持有物件鎖)。

在sleep()休眠時間期滿後,該執行緒不一定會立即執行,這是因為其它執行緒可能正在執行而且沒有被排程為放棄執行,除非此執行緒具有更高的優先順序。 

wait()方法

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...