線程池有哪些狀態

1.RUNNING:這是最正常的狀態,接受新的任務,處理等待隊列中的任務。線程池的初始化狀態是RUNNING。線程池被一旦被創建,就處於RUNNING狀態,並且線程池中的任務數爲0。

2.SHUTDOWN:不接受新的任務提交,但是會繼續處理等待隊列中的任務。調用線程池的shutdown()方法時,線程池由RUNNING -> SHUTDOWN。

3.STOP:不接受新的任務提交,不再處理等待隊列中的任務,中斷正在執行任務的線程。調用線程池的shutdownNow()方法時,線程池由(RUNNING or SHUTDOWN ) -> STOP。

4.TIDYING:所有的任務都銷燬了,workCount 爲 0,線程池的狀態在轉換爲 TIDYING 狀態時,會執行鉤子方法 terminated()。因爲terminated()在ThreadPoolExecutor類中是空的,所以用戶想在線程池變爲TIDYING時進行相應的處理;可以通過重載terminated()函數來實現。 

  • SHUTDOWN 狀態下,任務數爲 0, 其他所有任務已終止,線程池會變爲 TIDYING 狀態,會執行 terminated() 方法。線程池中的 terminated() 方法是空實現,可以重寫該方法進行相應的處理。
  • 線程池在 SHUTDOWN 狀態,任務隊列爲空且執行中任務爲空,線程池就會由 SHUTDOWN 轉變爲 TIDYING 狀態。
  • 線程池在 STOP 狀態,線程池中執行中任務爲空時,就會由 STOP 轉變爲 TIDYING 狀態。

5.TERMINATED:線程池徹底終止。線程池在 TIDYING 狀態執行完 terminated() 方法就會由 TIDYING 轉變爲 TERMINATED 狀態。

狀態轉換圖

JDK 源碼中的解釋如下

The runState provides the main lifecyle control, taking on values:

  RUNNING:  Accept new tasks and process queued tasks
  SHUTDOWN: Don't accept new tasks, but process queued tasks
  STOP:     Don't accept new tasks, don't process queued tasks,
            and interrupt in-progress tasks
  TIDYING:  All tasks have terminated, workerCount is zero,
            the thread transitioning to state TIDYING
            will run the terminated() hook method
  TERMINATED: terminated() has completed

狀態間的變化

RUNNING -> SHUTDOWN
   On invocation of shutdown(), perhaps implicitly in finalize()
(RUNNING or SHUTDOWN) -> STOP
   On invocation of shutdownNow()
SHUTDOWN -> TIDYING
   When both queue and pool are empty
STOP -> TIDYING
   When pool is empty
TIDYING -> TERMINATED
   When the terminated() hook method has completed

Threads waiting in awaitTermination() will return when the
state reaches TERMINATED.

掃一掃關注我的公衆號喲!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章