1. 這兩個方法來自不同的類,sleep方法屬於Thread,wait方法屬於Object。
2. 最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
3. wait, notify和notifyAll只能在同步控制方法(synchronized)或者同步控制塊里面使用,而sleep可以在任何地方使用。
4. sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常。
詳解:
sleep方法屬於Thread類中方法,表示讓一個線程進入睡眠狀態,等待一定的時間之后,自動醒來進入到可運行狀態,但它不會馬上進入運行狀態,因為其它線程可能正在運行而且沒有被調度為放棄執行,除非(a)“醒來”的線程具有更高的優先級; (b)正在運行的線程因為其它原因而阻塞。 一個線程對象調用了sleep方法之后,並不會釋放他所持有的所有對象鎖,所以也就不會影響其他進程對象的運行。但在 sleep的過程中過程中有可能被其他對象調用它的interrupt(),產生InterruptedException異常,如果你的程序不捕獲這個異常,線程就會異常終止,進入TERMINATED狀態,如果你的程序捕獲了這個異常,那么程序就會繼續執行catch語句塊(可能還有finally語句塊)以及以后的代碼。注意sleep()方法是一個靜態方法,也就是說他只對當前對象有效,不能通過t.sleep()讓t對象進入sleep。
wait屬於Object的成員方法,一旦一個對象調用了wait方法,必須要采用notify()和notifyAll()方法喚醒該進程。如果線程擁有某個或某些對象的同步鎖,那么在調用了wait()后,這個線程就會釋放它持有的所有同步資源,而不限於這個被調用了wait()方法的對象。從而使線程所在對象中的其它synchronized數據可被別的線程使用。 wait()方法也同樣會在wait的過程中有可能被其他對象調用interrupt()方法而產生InterruptedException,效果以及處理方式同sleep()方法。
