Java 線程中sleep和wait區別

Thread的狀態,先來看看Thread類裏面都有哪幾種狀態(Enum Thread.State):java

BLOCKED 阻塞狀態,當遇到synchronized或者lock且沒有取得相應的鎖,就會進入這個狀態
NEW 新建狀態,線程建立且沒有執行start方法時的狀態
RUNNABLE 可運行狀態,線程已經啓動,可是等待相應的資源(好比IO或者時間片切換)才能開始執行
TERMINATED 終止狀態,線程中斷或者運行結束的狀態
TIMED_WAITING 計時等待,當調用Thread.sleep()或者Object.wait(xx)或者Thread.join(xx)或者LockSupport.parkNanos或者LockSupport.partUntil時,進入該狀態
WAITING 等待狀態,當調用Object.wait或者Thread.join()且沒有設置時間,在或者LockSupport.park時,都會進入等待狀態。線程

接下來看sleep和wait的區別對象

1. sleep是Thread的一個靜態(static)方法。使得Runnable實現的線程也能夠使用sleep方法。並且避免了線程以前相互調用sleep()方法,引起死鎖。資源

2. wait方法是在Object上的,而sleep方法是在Thread上,因此sleep不會釋放線程的鎖,wait會釋放線程的鎖和資源。it

3. 執行時須要賦予一個沉睡時間。在沉睡期間(阻塞線程期間),CPU會放棄這個線程,執行其餘任務。當沉睡時間到了以後,該線程會自動甦醒,不過此時線程不會馬上被執行,而是要等CPU分配資源,和其餘線程進行競爭。io

4. wait(xxx) 能夠掛起線程,並釋放對象的資源,等計時結束後自動恢復;wait()則必需要其餘線程調用notify或者notifyAll才能喚醒。方法

5. wait必須放在synchronized block中,不然會在運行時報「java.lang.IllegalMonitorStateException」異常im

相關文章
相關標籤/搜索