1. 程式人生 > >wait()與sleep()方法區別

wait()與sleep()方法區別

探討wait()方法與sleep()方法的區別前,我們應該先了解執行緒的生命週期,即執行緒的幾種狀態:

執行緒的生命週期
下面來具體瞭解下sleep()和wait()方法的區別:

1.首先,sleep()方法屬於Thread類,針對當前程序的,必須捕獲異常,呼叫此方法後當前程序會停止執行一段時間,但不會釋放同步鎖及其佔有的資源,等到sleep()時間到了之後會進入就緒狀態,等待獲取CPU重新進入執行狀態。

2.而wait()方法是Object類的一個方法,不用丟擲異常,必須在同步程式碼塊或同步方法中使用它,使用它之後會釋放物件持有的鎖和佔有的資源,並進入等待阻塞池,只能由其它執行緒通過notify()方法喚醒,喚醒後進入鎖定阻塞池,等待獲得同步鎖後進入就緒狀態。

關於wait

為什麼一般總是在while迴圈中使用wait()?
答:因為喚醒處於wait()狀態的執行緒一般有兩個方法:notify()和notifyAll()。而由於notify()方法只是隨機的喚醒一個執行緒,所以並不太符合我們的要求,於是我們比較常用的是notifyAll()方法,而這個方法是喚醒所有處於wait()狀態的方法,而我們只想喚醒一些具有某種條件的執行緒,這裡就是導致while()和if()的區別了,while()會線上程被喚醒時接著先判斷是否滿足while()條件,滿足的話繼續wait(),而if()則是直接向下執行,所以我們應該使用while()而不是if().

關於interrupt()方法

線上程正常執行的時候被呼叫其interrupt()方法不會有任何影響,只是會修改它的中斷位為true,而當執行緒在進入sleep()/wait()/join()等阻塞狀態時,若中斷位為true,則執行緒會丟擲相應的異常,只需在catch異常時返回即可結束該程序。


參考:java中sleep和wait的區別