sleep和wait的區(qū)別是面試中一個非常常見的問題,因為從表象來看,好像sleep和wait都能使線程處于阻塞狀態(tài),但是卻有著本質(zhì)上的卻別。
區(qū)別一:
sleep是線程類(thread)的方法。導致此線程暫停執(zhí)行之地昂時間,給執(zhí)行的機會給其他線程,但是監(jiān)控狀態(tài)依然保持,到時候后自動回復,調(diào)用sleep不會釋放對象鎖。
wait是object類的方法,對此對象發(fā)出wait方法導致本線程放棄對象鎖,進入等待此對象的的呢古代鎖定池,只有針對此對象發(fā)出notify方法(或者notifyAll)后本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態(tài)。
區(qū)別二:
sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常。
sleep方法屬于Thread類中方法,表示讓一個線程進入睡眠狀態(tài),等待一定的時間之后,自動醒來進入到可運行狀態(tài),不會馬上進入運行狀態(tài),因為線程調(diào)度機制恢復線程的運行也需要時間,一個線程對象調(diào)用了sleep方法之后,并不會釋放他所持有的所有對象鎖,所以也就不會影響其他進程對象的運行。但在sleep的過程中過程中有可能被其他對象調(diào)用它的interrupt(),產(chǎn)生InterruptedException異常,如果你的程序不捕獲這個異常,線程就會異常終止,進入TERMINATED狀態(tài),如果你的程序捕獲了這個異常,那么程序就會繼續(xù)執(zhí)行catch語句塊(可能還有finally語句塊)以及以后的代碼。
wait屬于Object的成員方法,一旦一個對象調(diào)用了wait方法,必須要采用notify()和notifyAll()方法喚醒該進程;如果線程擁有某個或某些對象的同步鎖,那么在調(diào)用了wait()后,這個線程就會釋放它持有的所有同步資源,而不限于這個被調(diào)用了wait()方法的對象。wait()方法也同樣會在wait的過程中有可能被其他對象調(diào)用interrupt()方法而產(chǎn)生
區(qū)別三 :
這兩者的施加者是有本質(zhì)區(qū)別的。

sleep()是讓某個線程暫停運行一段時間,其控制范圍是由當前線程決定,也就是說,在線程里面決定。而wait(),首先,這是由某個確定的對象來調(diào)用的,將這個對象理解成一個傳話的人,當這個人在某個線程里面說”暫?!?。
了解更多java培訓相關(guān)面試問題歡迎關(guān)注達內(nèi)教育!
本文鏈接:
本文章“java線程leep和wait的區(qū)別”已幫助 102 人
免責聲明:本信息由用戶發(fā)布,本站不承擔本信息引起的任何交易及知識產(chǎn)權(quán)侵權(quán)的法律責任!
本文由賦能網(wǎng) 整理發(fā)布。了解更多培訓機構(gòu)》培訓課程》學習資訊》課程優(yōu)惠》課程開班》學校地址等機構(gòu)信息,可以留下您的聯(lián)系方式,讓課程老師跟你詳細解答:
咨詢熱線:4008-569-579