做者:林冠宏 / 指尖下的幽靈java
掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8git
博客:http://www.cnblogs.com/linguanh/github
GitHub : https://github.com/af913337456/併發
本文適合:函數
不適合:spa
經常使用的線程池
的知識相關點廢話少說,咱們開始。下圖,皆可自行保存,經常閱之。日久,根深蒂固線程
public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler ) {
....
}
複製代碼
參數名 | 做用 |
---|---|
corePoolSize | 隊列沒滿時,線程最大併發數 |
maximumPoolSizes | 隊列滿後線程可以達到的最大併發數 |
keepAliveTime | 空閒線程過多久被回收的時間限制 |
unit | keepAliveTime 的時間單位 |
workQueue | 阻塞的隊列類型 |
RejectedExecutionHandler | 超出 maximumPoolSizes + workQueue 時,任務會交給RejectedExecutionHandler來處理 |
corePoolSize,maximumPoolSize,workQueue之間關係。3d
當線程池中線程數小於corePoolSize時,新提交任務將建立一個新線程執行任務,即便此時線程池中存在空閒線程。代理
當線程池中線程數達到corePoolSize時,新提交任務將被放入workQueue中,等待線程池中任務調度執行 。code
當workQueue已滿,且maximumPoolSize > corePoolSize時,新提交任務會建立新線程執行任務。
當workQueue已滿,且提交任務數超過maximumPoolSize,任務由RejectedExecutionHandler處理。
當線程池中線程數超過corePoolSize,且超過這部分的空閒時間達到keepAliveTime時,回收這些線程。
當設置allowCoreThreadTimeOut(true)時,線程池中corePoolSize範圍內的線程空閒時間達到keepAliveTime也將回收。
public static ExecutorService newFixedThreadPool(int nThreads){
return new ThreadPoolExecutor(
nThreads, // corePoolSize
nThreads, // maximumPoolSize == corePoolSize
0L, // 空閒時間限制是 0
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>() // 無界阻塞隊列
);
}
複製代碼
public static ExecutorService newCachedThreadPool(){
return new ThreadPoolExecutor(
0, // corePoolSoze == 0
Integer.MAX_VALUE, // maximumPoolSize 很是大
60L, // 空閒斷定是60 秒
TimeUnit.SECONDS,
// 神奇的無存儲空間阻塞隊列,每一個 put 必需要等待一個 take
new SynchronousQueue<Runnable>()
);
}
複製代碼
public static ExecutorService newSingleThreadExecutor() {
return
new FinalizableDelegatedExecutorService
(
new ThreadPoolExecutor
(
1,
1,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory
)
);
}
複製代碼
能夠看到除了多了個 FinalizableDelegatedExecutorService
代理,其初始化和 newFiexdThreadPool
的 nThreads = 1 的時候是同樣的。 區別就在於:
使用ThreadFactory
,能夠改變線程的名稱、線程組、優先級、守護進程狀態,通常採用默認。
流程圖略,請參考 newFiexdThreadPool,這裏再也不累贅。
還有一個定時任務線程池ScheduledThreadPool
它用來處理延時或定時任務,不經常使用