1. 程式人生 > >ThreadPoolExecutor解析一(核心執行緒池數量、執行緒池狀態等)

ThreadPoolExecutor解析一(核心執行緒池數量、執行緒池狀態等)

   ThreadPoolExecutor的變數主要有核心執行緒池數量corePoolSize和最大執行緒池數量maximumPoolSize,即在當前任務執行緒數大於核心執行緒數量時,是否(allowCoreThreadTimeOut)允許空閒任務執行緒等,保活keepAliveTime時間,等待新任務的到來。一個執行緒工廠ThreadFactory用於建立任務執行緒,一個拒絕任務處理器RejectedExecutionHandler,預設的拒絕任務策略為AbortPolicy,丟擲執行時異常,當然還有直接丟棄策略DiscardPolicy,丟棄舊的任務DiscardOldestPolicy,還有呼叫者執行任務策略CallerRunsPolicy。上面的變數為volatile,以便執行緒池執行操作時,可以使用最新的變數。
    一個阻塞的任務佇列final BlockingQueue<Runnable> workQueue,阻塞佇列可以為Linked,Array,Delay,SynchronousQueue等阻塞型別,具體可以根據場景選擇。預設為LinkedBlockingQueue佇列,一般判斷佇列是否為空,用isEmpty方法,LinkedBlockingQueue一般用於任務相互之間獨立,沒有交叉,可獨立執行。如果用SynchronousQueue,則可用poll方法判斷,同步佇列一般用於任務之間有依賴的關係的場景,一個任務執行依賴於另一個任務的結果。DelayQueue佇列用於定時任務。ArrayBlockingQueue佇列一般可以用於
資源有限情況,可以避免資源被耗盡。一個AtomicInteger的ctl用於包裝執行緒狀態runState和任務執行緒數workerCount;低29位儲存任務執行緒數,高兩位用於儲存執行緒池狀態,執行緒池狀態已用有四種RUNNING,SHUTDOWN ,STOP,TIDYING ,TERMINATED。
RUNNING:接受新的任務,處理佇列任務;
SHUTDOWN:不在接受新的任務,處理佇列任務;
STOP:不在接受新任務,不處理佇列任務,中斷正在執行的任務執行緒;
TIDYING:所有的任務已經結束,任務執行緒為0,執行緒轉換到TIDYING;
TERMINATED:執行緒池已結束,即terminated()方法執行完。
執行緒的狀態是可以數字化比較的。

    一個任務執行緒集final HashSet<Worker> workers,largestPoolSize記錄執行緒池的最大任務執行緒數,completedTaskCount為完成任務計數器,在任務執行緒結束時,更新。一個可重入鎖mainLock,用於保護非執行緒安全的變數如workers,largestPoolSize,completedTaskCount。
一個等待執行緒池結束條件termination,用於控制超時等待執行緒池關閉。