ThreadPoolExecutor運行狀態

原文鏈接:https://blog.csdn.net/L_kanglin/article/details/57411851
  1. 線程池的5種狀態:Running、ShutDown、Stop、Tidying、Terminated。

  2. 線程池各個狀態切換框架圖:
    在這裏插入圖片描述

  3. RUNNING:

    1. 狀態說明:線程池處在RUNNING狀態時,能夠接收新任務,以及對已添加的任務進行處理。
    2. 狀態切換:線程池的初始化狀態是RUNNING。換句話說,線程池被一旦被創建,就處於RUNNING狀態,並且線程池中的任務數爲0!
  4. SHUTDOWN:

    1. 狀態說明:線程池處在SHUTDOWN狀態時,不接收新任務,但能處理已添加的任務。
    2. 狀態切換:調用線程池的shutdown()接口時,線程池由RUNNING -> SHUTDOWN。
  5. STOP:

    1. 狀態說明:線程池處在STOP狀態時,不接收新任務,不處理已添加的任務,並且會中斷正在處理的任務。
    2. 狀態切換:調用線程池的shutdownNow()接口時,線程池由(RUNNING or SHUTDOWN ) -> STOP。
  6. TIDYING :

    1. 狀態說明:當所有的任務已終止,ctl記錄的”任務數量”爲0,線程池會變爲TIDYING狀態。當線程池變爲TIDYING狀態時,會執行鉤子函數terminated()。terminated()在ThreadPoolExecutor類中是空的,若用戶想在線程池變爲TIDYING時,進行相應的處理;可以通過重載terminated()函數來實現。
    2. 狀態切換:當線程池在SHUTDOWN狀態下,阻塞隊列爲空並且線程池中執行的任務也爲空時,就會由 SHUTDOWN -> TIDYING。
      當線程池在STOP狀態下,線程池中執行的任務爲空時,就會由STOP -> TIDYING。
  7. TERMINATED:

    1. 狀態說明:線程池徹底終止,就變成TERMINATED狀態。
    2. 狀態切換:線程池處在TIDYING狀態時,執行完terminated()之後,就會由 TIDYING -> TERMINATED。
  8. 線程池的狀態 在源碼中展示:

public class ThreadPoolExecutor extends AbstractExecutorService {

		/**
     * 線程池狀態-RUNNING :
     * 1、功能:允許提交併處理任務;
     * 2、狀態轉換:線程池初始化後的狀態
     */
    private static final int RUNNING    = -1 << COUNT_BITS;

    /**
     * 線程池狀態-SHUTDOWN:
     * 1、功能:不接收新任務,但能處理已添加的任務。
     * 2、狀態轉換:當調用shutdown()接口,線程池由RUNNING -> SHUTDOWN。
     */
    private static final int SHUTDOWN   =  0 << COUNT_BITS;

    /**
     * 線程池狀態-STOP :
     * 1、功能:不允許提交新的任務,也不會處理阻塞隊列中未執行的任務,並設置正在執行的線程的中斷標誌位
     * 2、狀態轉換:調用線程池的shutdownNow()接口時,線程池由(RUNNING or SHUTDOWN ) -> STOP
     */
    private static final int STOP       =  1 << COUNT_BITS;

    /**
     * 線程池狀態-TIDYING :
     * 1、功能:當所有的任務已終止,ctl記錄的”任務數量”爲0,線程池會變爲TIDYING狀態,等待執行terminated()勾子方法
     *     【terminated()在ThreadPoolExecutor類中是空的,用戶重載terminated()函數來實現線程池關閉後的業務】
     * 2、狀態轉換1:當線程池在SHUTDOWN狀態下,阻塞隊列爲空並且線程池中執行的任務也爲空時,就會由 SHUTDOWN -> TIDYING
     *    狀態轉換2:當線程池在STOP狀態下,線程池中執行的任務爲空時,就會由STOP -> TIDYING
     */
    private static final int TIDYING    =  2 << COUNT_BITS;

    /**
     * 線程池狀態-TERMINATED :
     * 1、功能:線程池徹底終止,就變成TERMINATED狀態
     * 2、狀態轉換:線程池處在TIDYING狀態時,執行完terminated()之後,就會由 TIDYING -> TERMINATED。
     */
    private static final int TERMINATED =  3 << COUNT_BITS;

	
	// 省略其他代碼

}

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