1、Java線程的六種狀態函數


- 如上圖1,JDK定義線程狀態是不存在「運行中」狀態,但爲方便描述過程有些圖中會畫出運行中的狀態。
- Java線程建立後調用start方法進入就緒狀態,被OS調度選中後運行,運行結束或程序退出或拋異常時終止。
- 運行中線程調用Thread.yield()方法狀態切換爲可運行就緒狀態;運行中線程執行時遇到IO阻塞、調用Thread.sleep或其它線程對象join()方法時進入阻塞等待狀態;運行中線程遇到同步鎖方法時進入鎖池等待狀態。
- 線程從阻塞狀態、鎖池狀態、新建狀態、運行狀態均可以在相關條件知足時回到可運行就緒狀態,而後被OS調度選中進入運行狀態。
2、「VisualVM線程監控線程狀態」與「Java線程狀態」對應關係線程
經過VisualVM監控JVM時,能夠經過「線程」標籤頁查看JVM的線程信息,VisualVM的線程狀態以下:3d

經過dump thread stack,並與VisualVM監控信息中的線程名稱對應,找到的VisualVM每種線程狀態的線程堆棧對象

3、Java線程池的五種狀態blog

- 線程池的初始化狀態是RUNNING,可以接收新任務,以及對已添加的任務進行處理。
- 線程池處在SHUTDOWN狀態時,不接收新任務,但能處理已添加的任務。 調用線程池的shutdown()接口時,線程池由RUNNING -> SHUTDOWN。
- 線程池處在STOP狀態時,不接收新任務,不處理已添加的任務,而且會中斷正在處理的任務。 調用線程池的shutdownNow()接口時,線程池由(RUNNING or SHUTDOWN ) -> STOP。
- 當全部的任務已終止,ctl記錄的」任務數量」爲0,線程池會變爲TIDYING狀態。當線程池變爲TIDYING狀態時,會執行鉤子函數terminated()。terminated()在ThreadPoolExecutor類中是空的,若用戶想在線程池變爲TIDYING時,進行相應的處理;能夠經過重載terminated()函數來實現。
- 當線程池在SHUTDOWN狀態下,阻塞隊列爲空而且線程池中執行的任務也爲空時,就會由 SHUTDOWN -> TIDYING。 當線程池在STOP狀態下,線程池中執行的任務爲空時,就會由STOP -> TIDYING。
- 線程池完全終止,就變成TERMINATED狀態。線程池處在TIDYING狀態時,執行完terminated()以後,就會由 TIDYING -> TERMINATED。