目錄
- 一、原理不同
- 二、鎖的處理機制不同
- 三、使用的區域不同
- 四、異常捕獲不同
- 五、總結
一、原理不同
-
sleep()是Thread類的靜態方法
,是線程用來控制自身流程的,它會使此線程暫停執行指定的時間,而把執行機會讓給其他的線程,等到計時時間到,此線程會自動蘇醒。 -
wait()是Object類的方法
,用于線程間的通信,這個方法會使當前擁有該對象鎖的進程等待,直到其他線程調用notify()方法才醒來,也可以指定時間自己醒來。
二、鎖的處理機制不同
-
sleep()方法的主要作用是讓線程休眠指定一段時間,在時間到時自動恢復,不涉及線程間的通信,因此,
調用sleep()方法并不會釋放掉鎖
。 -
調用wait()方法的時候,線程會釋放掉它所占用的鎖
,從而使線程所在對象中的其他synchronized數據可以被其他線程使用。
三、使用的區域不同
-
sleep()方法則可以放在任何地方使用。
-
wait()必須放在同步控制方法或者同步語句塊中使用。
四、異常捕獲不同
-
sleep()方法必須捕獲異常,在sleep()的過程中,有可能別的其他對象調用其interrupt(),產生InterruptedException異常。
-
wait(),notify()以及notifyall()不需要捕獲異常。
五、總結
sleep()不會釋放鎖標志,容易導致死鎖的發生,所以一般情況下,不推薦使用sleep方法,而是使用wait方法。