對于sleep()方法,我們首先要知道該方法是屬于Thread類中的。而wait()方法,則是屬于Object類中的。
sleep()方法導致了程序暫停執(zhí)行指定的時間,讓出cpu該其他線程,但是他的監(jiān)控狀態(tài)依然保持者,當指定的時間到了又會自動恢復運行狀態(tài)。
在調(diào)用sleep()方法的過程中,線程不會釋放對象鎖。
而當調(diào)用wait()方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調(diào)用notify()方法后本線程才進入對象鎖定池準備
從使用角度看,sleep是Thread線程類的方法,而wait是Object頂級類的方法。
sleep可以在任何地方使用,而wait只能在同步方法或者同步塊中使用。
CPU及資源鎖釋放
sleep,wait調(diào)用后都會暫停當前線程并讓出cpu的執(zhí)行時間,但不同的是sleep不會釋放當前持有的對象的鎖資源,到時間后會繼續(xù)執(zhí)行,而wait會放棄所有鎖并需要notify/notifyAll后重新獲取到對象鎖資源后才能繼續(xù)執(zhí)行。
sleep和wait的區(qū)別:
1、sleep是Thread的靜態(tài)方法,wait是Object的方法,任何對象實例都能調(diào)用。
2、sleep不會釋放鎖,它也不需要占用鎖。wait會釋放鎖,但調(diào)用它的前提是當前線程占有鎖(即代碼要在synchronized中)。
3、它們都可以被interrupted方法中斷。
具體來說:
Thread.Sleep(1000)意思是在未來的1000毫秒內(nèi)本線程不參與CPU競爭,1000毫秒過去之后,這時候也許另外一個線程正在使用CPU,那么這時候操作系統(tǒng)是不會重新分配CPU的,直到那個線程掛起或結(jié)束,即使這個時候恰巧輪到操作系統(tǒng)進行CPU分配,那么當前線程也不一定就是總優(yōu)先級最高的那個,CPU還是可能被其他線程搶占去。另外值得一提的是Thread.Sleep(0)的作用,就是觸發(fā)操作系統(tǒng)立刻重新進行一次CPU競爭,競爭的結(jié)果也許是當前線程仍然獲得CPU控制權(quán),也許會換成別的線程獲得CPU控制權(quán)。
wait(1000)表示將鎖釋放1000毫秒,到時間后如果鎖沒有被其他線程占用,則再次得到鎖,然后wait方法結(jié)束,執(zhí)行后面的代碼,如果鎖被其他線程占用,則等待其他線程釋放鎖。注意,設(shè)置了超時時間的wait方法一旦過了超時時間,并不需要其他線程執(zhí)行notify也能自動解除阻塞,但是如果沒設(shè)置超時時間的wait方法必須等待其他線程執(zhí)行notify。