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

Java 多線程 sleep()方法與wait()方法的區別

程序 一段 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()方法的區別