線程池分四類:
1.newSingleThreadExecutor()
單個(gè)線程容量
2.newFixedThreadPool()
固定線程數(shù)量
3.newCachedThreadPool()
可根據(jù)實(shí)際情況調(diào)整線程數(shù)量
優(yōu)先使用可復(fù)用的線程
4.newScheduledThreadPool()
線程數(shù)量為1谍夭,
可以固定時(shí)間延時(shí)執(zhí)行任務(wù)
或周期性執(zhí)行任務(wù)
public ThreadPoolExecutor(int corePoolSize,/*線程池中線程數(shù)*/
int maximumPoolSize,/*線程池中最大線程數(shù)*/
long keepAliveTime,/*當(dāng)線程池線程數(shù)超過corePoolSize后叽躯,空閑線程的最大存活時(shí)間*/
TimeUnit unit,/*keepAliveTime單位*/
BlockingQueue<Runnable> workQueue,/*任務(wù)隊(duì)列*/
ThreadFactory threadFactory,/*創(chuàng)建線程厢塘,默認(rèn)即可*/
RejectedExecutionHandler handler/*拒絕策略*/) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
前幾個(gè)都很好理解州袒,我們從workQueue開始
workQueue是指被提交但是未執(zhí)行的任務(wù)隊(duì)列歪玲,它是一個(gè)BlockingQueue接口對(duì)象载矿,僅用于存Runnable對(duì)象漆羔,接下來看下可用的幾種隊(duì)列:
1.直接提交隊(duì)列
由SynchronousQueue對(duì)象提供剿干。
沒有容量婆芦,目的就是為了實(shí)現(xiàn)拒絕策略怕磨,每一個(gè)插入操作都要等待相應(yīng)的刪除操作,反之消约,每一個(gè)刪除操作都要等待相應(yīng)的插入操作肠鲫。
使用SynchronousQueue這種隊(duì)列,提交的任務(wù)不會(huì)真正的保存荆陆,而是將新任務(wù)提交給線程滩届,沒有空閑線程,就新建一個(gè)被啼,到達(dá)最大值了帜消,就執(zhí)行拒絕策略!
使用SynchronousQueue隊(duì)列浓体,通常要設(shè)置很大的maximumPoolSize的值泡挺,否則很容易執(zhí)行拒絕策略。
2.有界任務(wù)隊(duì)列(以ArrayBlockingQueue為例)
ArrayBlockingQueue的構(gòu)造函數(shù)必須提供容量參數(shù)命浴。
public ArrayBlockingQueue(int capacity)
使用ArrayBlockingQueue時(shí)娄猫,如果有新任務(wù)需要執(zhí)行,
如果線程池的實(shí)際線程數(shù)小于corePoolSize生闲,則會(huì)優(yōu)先創(chuàng)建新的線程媳溺,
若大于corePoolSize,則會(huì)將新任務(wù)放進(jìn)等待隊(duì)列碍讯。
如果等隊(duì)列已滿悬蔽,無法加入,
在總線程數(shù)不大于maximumPoolSize的前提下捉兴,創(chuàng)建新線程執(zhí)行任務(wù)蝎困。
否則,執(zhí)行拒絕策略倍啥。
3.無界任務(wù)隊(duì)列(以LinkedBlockedQueue為例)
這種隊(duì)列禾乘,除非系統(tǒng)資源耗盡,否則不存在任務(wù)入隊(duì)失敗的情況虽缕。
新任務(wù)來的時(shí)候
線程數(shù)小于corePoolSize時(shí)始藕,線程池會(huì)生成新的線程執(zhí)行任務(wù),
等于corePoolSize后,就無限往等待隊(duì)列里入隊(duì)鳄虱。
5苋!W疽选>黾恰!如果處理速度遠(yuǎn)小于創(chuàng)建速度倍踪,等待隊(duì)列就會(huì)很快增長(zhǎng)系宫,直到耗盡系統(tǒng)資源!=ǔ怠@┙琛!缤至!
4.優(yōu)先任務(wù)隊(duì)列(通過PriorityBlockedQueue來實(shí)現(xiàn))
PriorityBlockedQueue可以控制任務(wù)的執(zhí)行先后順序潮罪。是一個(gè)特殊的無界隊(duì)列。