1. 程式人生 > 其它 >sleep與wait有什麼區別

sleep與wait有什麼區別

sleep()是使執行緒暫停執行一段時間的方法。wait()也是一種使執行緒暫停執行的方法,例如,當執行緒互動時,如果執行緒對一個同步執行緒x發出一個wait()呼叫請求,

那麼該執行緒會暫停執行,被調物件進入等待狀態,直到被喚醒或等待時間超時。

具體而言,sleep與wait的區別主要表現在以下幾個方面:

1)原理不同。sleep是Thread類的靜態方法,是執行緒用來控制自身流程的,它會使此執行緒暫停執行指定時間,而把執行機會會讓給其他執行緒,等到計時時間到時,

此執行緒會自動甦醒。例如,當執行緒執行報時功能時,每一秒鐘打印出一個時間,那麼此時就需要在列印方法前面加上一個sleep方法,以便讓自己每隔一秒執行一次,

該過程如同鬧鐘一樣。而wait是Object類的方法,用於執行緒間的通訊,這個方法會使當前擁有物件鎖的程序等待,直到其他執行緒呼叫notify方法(或notifyAll方法)

時才醒來。一個開發人員也可以給它指定一個時間,自動醒來。與wait配套的方法有notify和notifyAll。

2)對鎖的處理機制不同。由於sleep方法的主要作用是讓執行緒休眠指定的一段時間,在時間到時自動恢復,不涉及執行緒間的通訊,因此,呼叫sleep方法並不會釋

放鎖。而wait方法則不同,當呼叫wait方法後,執行緒會釋放掉它所佔用的鎖,從而使執行緒所在物件的其他synchronized資料可被其他執行緒使用。舉個簡單例子,在小

明拿遙控器期間,他可以用自己的sleep方法每隔十分鐘掉一次電視臺,而在他調臺休息的十分鐘期間,遙控器還在他的手上。

3)使用區域不同。由於wait方法的特殊意義,所以,它必須放在同步控制方法或者同步語句塊使用,而sleep則可以放在任何地方使用。

4)sleep方法必須捕獲異常,而wait,notify以及notifyall不需要捕捉異常。在sleep的過程中,有可能被其他物件呼叫它的interrupt(),產生InterruptedException

異常。由於sleep不會釋放“鎖標誌”,容易導致死鎖問題的發生,所以,一般情況下,不推薦使用sleep方法,而推薦使用wait方法。