線程池包含哪些狀態?


線程池狀態:

線程池的5種狀態:RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED。

見 ThreadPoolExecutor 源碼

// runState is stored in the high-order bits
    private static final int RUNNING    = -1 << COUNT_BITS;
    private static final int SHUTDOWN   =  0 << COUNT_BITS;
    private static final int STOP       =  1 << COUNT_BITS;
    private static final int TIDYING    =  2 << COUNT_BITS;
    private static final int TERMINATED =  3 << COUNT_BITS;

 

 

1. RUNNING:線程池一旦被創建,就處於 RUNNING 狀態,任務數為 0,能夠接收新任務,對已排隊的任務進行處理。

 

2. SHUTDOWN:不接收新任務,但能處理已排隊的任務。調用線程池的 shutdown() 方法,線程池由 RUNNING 轉變為 SHUTDOWN 狀態。

 

3. STOP:不接收新任務,不處理已排隊的任務,並且會中斷正在處理的任務。調用線程池的 shutdownNow() 方法,線程池由(RUNNING 或 SHUTDOWN ) 轉變為 STOP 狀態。

 

4. TIDYING:

  • 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.

 

 

 

 來一道刷了進BAT的面試題?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM