sleep()方法與wait()方法有什麼區別?
阿新 • • 發佈:2018-12-14
個人部落格:小景哥哥
sleep()方法與wait()方法有什麼區別?
sleep()是使執行緒暫停執行一段時間的方法。wait()也是一種使執行緒暫停執行的方法。二者區別為:
①原理不同。
sleep()方法是Thread類的靜態方法,是執行緒用來控制自身流程的,它會使此執行緒暫停執行一段時間,而把執行機會讓給其他執行緒,等到計時時間一到,此執行緒會自動甦醒。而wait()方法是Object類的方法,用於執行緒間的通訊,這個方法會使當前擁有該物件鎖的程序等待,直到其他執行緒用呼叫notify()或notifyAll()時才甦醒過來,開發人員也可以給它指定一個時間使其自動醒來。
②對鎖的處理機制不同。
由於sleep()方法的主要作用是讓執行緒暫停一段時間,時間一到則自動恢復,不涉及執行緒間的通訊,因此呼叫sleep()方法並不會釋放鎖。而wait()方法則不同,當呼叫wait()方法後,執行緒會釋放掉它所佔用的鎖,從而使執行緒所在物件中的其他synchronized資料可被別的執行緒使用。
③使用區域不同。
wait()方法必須放在同步控制方法或者同步語句塊中使用,而sleep方法則可以放在任何地方使用。
sleep()方法必須捕獲異常,而wait()、notify()、notifyAll()不需要捕獲異常。在sleep的過程中,有可能被其他物件呼叫它的interrupt(),產生InterruptedException異常。
由於sleep不會釋放鎖標誌,容易導致死鎖問題的發生,一般情況下,不推薦使用sleep()方法,而推薦使用wait()方法。