【Java】sleep和wait區別總結

love_Aym發表於2018-04-17

來源:https://blog.csdn.net/zlfprogram/article/details/77257373


一、來源類: 

  • sleep是Thread類的靜態方法; 
  • wait是Object的方法,可以對任意一個物件呼叫wait方法

二、使用範圍: 

  • sleep可以在任何地方使用,必須捕獲異常; 
  • wait只能在同步控制方法或者同步控制塊裡面使用,不需要捕獲異常

三、鎖: 

  • sleep不釋放鎖,不出讓鎖資源,但會讓出CPU資源; 
  • wait釋放了鎖,進入執行緒等待池等待,出讓系統資源(鎖資源和CPU資源)

執行緒的資源有不少,但應該包含CPU資源和鎖資源這兩類。

   (1)sleep(long mills):讓出CPU資源,但是不會釋放鎖資源。

   (2)wait():讓出CPU資源和鎖資源。

    鎖是用來執行緒同步的,sleep(long mills)雖然讓出了CPU,但是不會讓出鎖,其他執行緒可以利用CPU時間片了,但如果其他執行緒要獲取sleep(long mills)擁有的鎖才能執行,則會因為無法獲取鎖而不能執行,繼續等待。

    但是那些沒有和sleep(long mills)競爭鎖的執行緒,一旦得到CPU時間片即可執行了。


四、喚醒: 

  • sleep(ms) 將一個執行緒睡眠並指定時間自動醒,如果時間不到可以呼叫interreput()來強行打斷; 
  • wait() 將一個執行緒掛起,直到超時或者該執行緒被喚醒。

五、施加者是有本質區別 

  • 兩者都可以讓執行緒暫停一段時間,但是本質的區別是一個執行緒的執行狀態控制,一個是執行緒之間的通訊的問題
  • sleep()是讓某個執行緒暫停執行一段時間,其控制範圍是由當前執行緒決定,也就是說,線上程裡面決定.好比說,我要做的事情是 “點火->燒水->煮麵”,而當我點完火之後我不立即燒水,我要休息一段時間再燒.對於執行的主動權是由我的流程來控制.
  • 而wait(),首先這是由某個確定的物件來呼叫的,將這個物件理解成一個傳話的人,當這個人在某個執行緒裡面說”暫停!”,也是 thisOBJ.wait(),這裡的暫停是阻塞,還是”點火->燒水->煮飯”,thisOBJ就好比一個監督我的人站在我旁邊,本來該執行緒應該執行1後執行2,再執行3,而在2處被那個物件喊暫停,那麼我就會一直等在這裡而不執行3,但正個流程並沒有結束,我一直想去煮飯,但還沒被允許, 直到那個物件在某個地方說”通知暫停的執行緒啟動!”,也就是thisOBJ.notify()的時候,那麼我就可以煮飯了,這個被暫停的執行緒就會從暫停處繼續執行.


相關文章