sleep() 和 wait() 有什麼區別? 匿名使用者 1級 2018-08-17 回答

1、這兩個方法來自不同的類分別是Thread和Object

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

3、wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在。

4、sleep是讓某個執行緒暫停執行一段時間,其控制範圍是由當前執行緒決定,也就是說,線上程裡面決定。好比如說,我要做的事情是 “點火->燒水->煮麵”,而當我點完火之後我不立即燒水,我要休息一段時間再燒。對於執行的主動權是由我的流程來控制。

5、而wait,首先,這是由某個確定的物件來呼叫的,將這個物件理解成一個傳話的人,當這個人在某個執行緒裡面說“暫停!”,也是 thisOBJ。wait(),這裡的暫停是阻塞,還是“點火->燒水->煮飯”。

sleep() 和 wait() 有什麼區別? 匿名使用者 1級 2018-08-17 回答

sleep是讓執行緒指定休眠時間,然後繼續工作

wait則是等待,直到有執行緒通知notify()喚醒他才會重新工作。

sleep() 和 wait() 有什麼區別? 匿名使用者 1級 2018-08-17 回答

sleep是你困了,要睡覺,等你睡醒了再幹活。

wait是你現在沒事做,先眯會兒吧,什麼時候領導提醒你該幹活了再幹。

sleep() 和 wait() 有什麼區別? 匿名使用者 1級 2018-08-18 回答

先說wait,wait的本質是條件等待,這裡涉及到了鎖的概念(也就是多執行緒中要保證執行緒安全的鎖)。所謂條件等待就是已經獲得了鎖的執行緒,由於需要滿足某種條件才能繼續執行,而當前不滿足條件,所以只能等待。所以呼叫wait的一個前提條件就是要先拿到鎖。拿到鎖的執行緒,wait之後,該執行緒就進入條件等待佇列,並且釋放鎖,讓其他執行緒執行。當其他執行緒的執行使得條件滿足之後,再呼叫notify或者notifyAll方法,將條件等待佇列中的執行緒喚醒,這些執行緒再去請求鎖,拿到鎖的執行緒接著去執行。建議你看一下ReentrantLock類,順便用一下Condition類,看一看《Java核心技術》第二卷關於執行緒那一章的講解。

呼叫wait()/wait(long t)執行緒進入Waiting/TimeWaiting狀態。

sleep(long t)的意思是暫停當前執行緒t毫秒,當然,其他執行緒就得到了時間片,sleep與執行緒是否獲得鎖無關。呼叫sleep執行緒進入TimeWaiting狀態。

這裡有張比較基礎的圖,你看一下。

搜狗問問