ThreadPoolExecutor源碼解析

 創建線程池最終都會調用下面這個方法


對上面參數做一下簡單講解

corePoolSize 線程池中核心線程數
maximumPoolSize 線程池中最大線程數
keepAliveTime 線程池中空閒線程存活時間
TimeUnit    keepAliveTime的單位
workQueue 阻塞隊列BlockingQueue 實例
threadFactory 線程工廠, 用於創建線程
handler 線程池的飽和策略

簡單介紹下成員變量

    private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
ctl維護兩個概念上的參數:(後29位)workCount和(前三位)runState。workCount表示有效的線程數量,runState表示線程池的運行狀態。運行狀態只要有五個,分別是RUNNING、SHUTDOWN、STOP、TIDYING和TERMINATED

狀態值就是隻關心前三位的值,所以把後29位清0
private static int runStateOf(int c)     { return c & ~CAPACITY; }

線程數量就是隻關心後29位的值,所以把前3位清0
    private static int workerCountOf(int c)  { return c & CAPACITY; }

兩個數相或
    private static int ctlOf(int rs, int wc) { return rs | wc; }


線程佔用的數量
    private static final int COUNT_BITS = Integer.SIZE - 3;
最大線程數量
    private static final int CAPACITY   = (1 << COUNT_BITS) - 1;


線程池運行狀態
接受新任務並且處理已經進入隊列的任務
    private static final int RUNNING    = -1 << COUNT_BITS;
不接受新任務但是處理進入隊列的任務
    private static final int SHUTDOWN   =  0 << COUNT_BITS;
    不接受新任務不處理進入隊列的任務 中斷執行的任務
private static final int STOP       =  1 << COUNT_BITS;
    所有任務執行完成 線程轉到了狀態TIDYING會執行terminated()鉤子方法
private static final int TIDYING    =  2 << COUNT_BITS;
    terminated()已經執行完成 
private static final int TERMINATED =  3 << COUNT_BITS;
線程的提交方法主要是execute和submit   submit會調用execute方法   這裏主要講解execute方法  都是個人理解有誤請指正


線程池的飽和策略 一共有下面四種

static class ThreadPoolExecutor.AbortPolicy 
          用於被拒絕任務的處理程序,它將拋出 RejectedExecutionException. 
static class ThreadPoolExecutor.CallerRunsPolicy 
          用於被拒絕任務的處理程序,它直接在 execute 方法的調用線程中運行被拒絕的任務;如果執行程序已關閉,則會丟棄該任務。 
static class ThreadPoolExecutor.DiscardOldestPolicy 
          用於被拒絕任務的處理程序,它放棄最舊的未處理請求,然後重試 execute;如果執行程序已關閉,則會丟棄該任務。 
static class ThreadPoolExecutor.DiscardPolicy 
          用於被拒絕任務的處理程序,默認情況下它將丟棄被拒絕的任務。

本文只講解這些其他的感興趣自己可以多看看

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