查看Executors工具類中newCachedThreadPool(), newSingleThreadExcecutor(), newFixedThreadPool()源碼:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue());
}
該線程池在極端情況下,每次提交新的任務(wù)都會(huì)創(chuàng)建新的線程執(zhí)行. 適合用來(lái)執(zhí)行大量耗時(shí)短并且提交頻繁的任務(wù)
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue());
}
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue()));
}
ThreadPoolExecutor的構(gòu)造方法:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
corePoolSize, 指定線程池中核心線程的數(shù)量。
maxinumPoolSize,指定線程池中最大線程數(shù)量。
keepAliveTime,當(dāng)線程池線程的數(shù)量超過(guò)corePoolSize時(shí),多余的空閑線程的存活時(shí)長(zhǎng),即空閑線程在多長(zhǎng)時(shí)長(zhǎng)內(nèi)銷毀。
unit, 是keepAliveTime時(shí)長(zhǎng)單位。
workQueue,任務(wù)隊(duì)列,把任務(wù)提交到該任務(wù)隊(duì)列中等待執(zhí)行。
threadFactory,線程工廠,用于創(chuàng)建線程。
handler拒絕策略,當(dāng)任務(wù)太多來(lái)不及處理時(shí),如何拒絕。
說(shuō)明:
workQueue工作隊(duì)列是指提交未執(zhí)行的任務(wù)隊(duì)列,它是BlockingQueue接口的對(duì)象,僅用于存儲(chǔ)Runnable任務(wù).根據(jù)隊(duì)列功能分類,在ThreadPoolExecutor構(gòu)造方法中可以使用以下幾種阻塞隊(duì)列:
1、直接提交隊(duì)列,由SynchronousQueue 對(duì)象提供,該隊(duì)列沒有容量,提交給線程池的任務(wù)不會(huì)被真實(shí)的保存,總是將新的任務(wù)提交給線程執(zhí)行,如果沒有空閑線程,則嘗試創(chuàng)建新的線程,如果線程數(shù)量已經(jīng)達(dá)到maxinumPoolSize規(guī)定的最大值則執(zhí)行拒絕策略。
2、有界任務(wù)隊(duì)列,由ArrayBlockingQueue實(shí)現(xiàn),在創(chuàng)建ArrayBlockingQueue對(duì)象時(shí),可以指定一個(gè)容量. 當(dāng)有任務(wù)需要執(zhí)行時(shí),如果線程池中線程數(shù)小于corePoolSize核心線程數(shù)則創(chuàng)建新的線程;如果大于corePoolSize核心線程數(shù)則加入等待隊(duì)列.如果隊(duì)列已滿則無(wú)法加入,在線程數(shù)小于maxinumPoolSize指定的最大線程數(shù)前提下會(huì)創(chuàng)建新的線程來(lái)執(zhí)行,如果線程數(shù)大于maxinumPoolSize最大線程數(shù)則執(zhí)行拒絕策略。

3、無(wú)界任務(wù)隊(duì)列,由LinkedBlockingQueue對(duì)象實(shí)現(xiàn),與有界隊(duì)列相比,除非系統(tǒng)資源耗盡,否則無(wú)界隊(duì)列不存在任務(wù)入隊(duì)失敗的情況. 當(dāng)有新的任務(wù)時(shí),在系統(tǒng)線程數(shù)小于corePoolSize核心線程數(shù)則創(chuàng)建新的線程來(lái)執(zhí)行任務(wù);當(dāng)線程池中線程數(shù)量大于corePoolSize核心線程數(shù)則把任務(wù)加入阻塞隊(duì)列。
4、優(yōu)先任務(wù)隊(duì)列是通過(guò) PriorityBlockingQueue實(shí)現(xiàn)的,是帶有任務(wù)優(yōu)先級(jí)的隊(duì)列,是一個(gè)特殊的無(wú)界隊(duì)列.不管是ArrayBlockingQueue隊(duì)列還是LinkedBlockingQueue隊(duì)列都是按照先進(jìn)先出算法處理任務(wù)的.在PriorityBlockingQueue隊(duì)列中可以根據(jù)任務(wù)優(yōu)先級(jí)順序先后執(zhí)行。