Java 多線程 sleep()方法與wait()方法的區別
阿新 • • 發佈:2018-01-25
程序 一段 exc 非靜態方法 not mil java程序 div 推薦
sleep()方法會使線程暫停執行一段時間,wait()方法會阻塞線程,直到被喚醒或等待時間超時。
兩者區別具體如下:
1 原理不同
sleep()方法是Thread類的靜態方法,使線程暫停執行一段時間,等到計時結束,該線程會自動“蘇醒”。而wait()方法是Object類的非靜態方法,用於線程間的通信,使當前擁有該對象鎖的線程等待,直到其他線程調用notify()方法(或notifyAll()方法)時才被喚醒。也可以通過計時即設置超時時間來自動喚醒該線程。
2 對鎖的處理機制不同
sleep()方法不涉及線程間的通信,不會釋放鎖。而wait()方法會使線程釋放占有的鎖。
3 使用區域不同
sleep()方法可以放在任何地方,而wait()方法只能放在同步塊中。
4 是否捕獲異常不同
sleep()方法必須捕獲異常,而wait()、notify()和notifyAll()這些方法不需要捕獲異常。在線程睡眠過程中,有可能被其他對象調用它的interrupt()方法,拋出InterruptedException異常。
綜上所述,因為sleep()方法不會釋放鎖,容易產生死鎖問題,所以推薦使用wait()方法。
參考資料
《Java程序員面試筆試寶典》 P149-150
Java 多線程 sleep()方法與wait()方法的區別