線程狀態與阻塞

線程的狀態

1.NEW:初始狀態。
線程被創建。
2.RUNNABLE:運行狀態。
java的運行狀態(RUNNABLE)狀態包括操作系統中的就緒(READY)和運行中(RUNNING)兩種狀態。
Thread.start會使線程進入Runnable狀態。
yield會使線程從RUNNING狀態進入READY狀態。
3.BLOCKED:阻塞狀態。
表示線程等待獲取監視器鎖,線程阻塞於鎖。
當線程調用同步方法時,在沒有獲取到鎖的情況下,線程將會進入到阻塞狀態。線程等待進入synchronized方法/代碼塊。
BLOCKED狀態的線程獲取到鎖,就從BLOCKED狀態變爲RUNNABLE狀態。
4.WAITING:等待狀態。
當前線程需要等待其他線程通知或中斷才能繼續執行。
Object.wait/Thread.join/LockSupport.park會使線程進入Waiting狀態。
notify/notifyAll/unpark喚醒線程進入Runnable狀態。
5.TIME_WAITING:超時等待狀態。
Thread.sleep(long)/Object.wait(long)/Thread.join(long)/LockSupport.parkNanos/LockSupport.parkUntil會使線程進入TIME_WAITING狀態。
超時時間到了/notify/notifyAll/unpark,線程進入Runnable狀態。
6.TERMINATED:終止狀態。線程執行完畢。

引用自《Java併發編程的藝術》

不同種類的阻塞(廣義)

阻塞在synchronized關鍵字的線程狀態是BLOCKED。BLOCKED狀態是狹義的阻塞。 阻塞在Object.wait/Thread.join/LockSupport.park/JUC包中Lock接口的線程狀態是WAITING 阻塞在Thread.sleep(long)/Object.wait(long)/Thread.join(long)/LockSupport.parkNanos/LockSupport.parkUntil的線程狀態是TIME_WAITING 阻塞在IO操作的線程狀態是RUNNING(屬於RUNNABLE)