一、sleep是Thread的方法,wait是Object的方法
二、sleep不釋放鎖,wait會釋放
? ? ? ? 線程調(diào)用sleep方法后,當前線程會進行睡眠,且線程進入阻塞狀態(tài),但不會釋放已持有的鎖(如果有的話,如果沒有鎖也可以執(zhí)行sleep方法)。即線程只會讓出cpu執(zhí)行時間片,不會釋放同步資源鎖。
? ? ? ? 線程執(zhí)行wait方法后,當前線程會進入阻塞等待狀態(tài),讓出cpu執(zhí)行時間片的同時釋放同步資源鎖(一定有鎖,因為wait方法必須和synchronized或Lock一起使用,即第三點)
三、sleep不依賴同步方法,wait依賴

執(zhí)行wait()報錯

報錯信息
可見wait方法必須在同步代碼區(qū)中執(zhí)行(synchronized或lock)。而sleep方法不需要。
四、sleep不需要被喚醒,wait需要。
sleep比較簡單,我們著重看一下wait,我們可以去查看到源碼中的一段注釋。

jdk源碼中wait方法的注釋
翻譯一下就是:
導致當前線程等待,直到另一個線程為此對象調(diào)用notify()方法或notifyAll()方法。 換句話說,此方法的行為就像它簡單地執(zhí)行調(diào)用wait(0)一樣。
當前線程必須擁有該對象的監(jiān)視器。線程釋放對此監(jiān)視器的所有權,并等待直到另一個線程通過調(diào)用notify方法或notifyAll方法通知等待在該對象的監(jiān)視器上喚醒的線程。然后線程等待,直到可以重新獲得監(jiān)視器的所有權并恢復執(zhí)行。
與在一個參數(shù)版本中一樣,可能發(fā)生中斷和虛假喚醒,并且該方法應始終在循環(huán)中使用:...此方法只能由作為此對象的監(jiān)視器的所有者的線程調(diào)用。有關線程可以成為監(jiān)視器所有者的方式的說明,請參見{@code notify}方法。