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方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM