1 操作系統中的線程狀態
- 創建:線程從創建到被cpu執行之前的這個階段。
- 就緒:指線程已具備各種執行條件,一旦獲取cpu便可執行。
- 運行:表示線程正獲得cpu在運行。
- 阻塞:指線程在執行中因某件事而受阻,處於暫停執行的狀態,阻塞的線程不會去競爭cpu。
- 終止:線程執行完畢,接下來會釋放線程佔用的資源。
線程的生命週期圖如下(進程與線程生命週期一樣):
2 Java中線程的狀態
Thread類中維護類一個內部枚舉類State,裏面是線程的狀態,屬性如下:
- NEW:表示未啓動的線程。
- RUNNABLE:表示線程正在JVM中執行,但執行的動作也可能是“等待”:等待操作系統的某些資源如處理器。
- BLOCKED:表示線程正在等待一個鎖去進入某個同步方法或同步代碼塊。
- WAITING:表示因爲調用接下來的方法,線程正在等待。包括:Object.wait()、Thread.join()和LockSupport.part()。直到另外一個線程執行一個特殊的動作該線程纔會退出等待狀態。如:該線程調用Object.wait(),需要另外一個線程調用Object.notify()或Object.notifyAll()。
- TIMED_WAITING:表示線程因爲調用接下來的方法,線程正在等待,等待時間最多爲一個具體的值。包括:Thread.sleep(time)、Object.wait(time)、Thread.join(time)、LockSupport.parkNanos(time)和LockSupport.parkUntil(time)。直到另外一個線程執行一個特殊的動作該線程纔會退出等待狀態。如:該線程調用Object.wait(3000),另外一個線程調用Object.notify()或Object.notifyAll()可以使該線程退出等待狀態。
- TERMINATED:表示一個終止的線程,這個線程的執行已經完成。
生命週期圖如下,下面紅色字體是操作系統中對應Java中的線程狀態:
注意Java中,當線程執行到同步代碼區,若線程被執行等待方法,則線程會釋放鎖並進入等待狀態,等待狀態的線程不會參與鎖的競爭,即若其它持有鎖的線程執行完成後不會喚醒處於等待狀態的線程,而阻塞狀態的線程可能會被喚醒。等待狀態的線程被喚醒後會從等待隊列移除,加入到阻塞隊列中,參與鎖的競爭。