創建線程池最終都會調用下面這個方法
對上面參數做一下簡單講解
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; |
線程池的飽和策略 一共有下面四種
static class ThreadPoolExecutor.AbortPolicy
用於被拒絕任務的處理程序,它將拋出 RejectedExecutionException.
static class ThreadPoolExecutor.CallerRunsPolicy
用於被拒絕任務的處理程序,它直接在 execute 方法的調用線程中運行被拒絕的任務;如果執行程序已關閉,則會丟棄該任務。
static class ThreadPoolExecutor.DiscardOldestPolicy
用於被拒絕任務的處理程序,它放棄最舊的未處理請求,然後重試 execute;如果執行程序已關閉,則會丟棄該任務。
static class ThreadPoolExecutor.DiscardPolicy
用於被拒絕任務的處理程序,默認情況下它將丟棄被拒絕的任務。
本文只講解這些其他的感興趣自己可以多看看