在Android-27中查看源碼:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {}
corePoolSize:除非設(shè)置了allowCoreThreadTimeOut肄程,否則即使它們處于閑置狀態(tài)灭将,也要在線程池中保留的線程數(shù)量
maximumPoolSize:在線程池中允許的最大線程數(shù)
keepAliveTime:當(dāng)線程數(shù)超過corePoolSize時(shí)塞赂,處于閑置狀態(tài)的非核心線程等待執(zhí)行新的任務(wù)的最大等待時(shí)間,超過便會(huì)終止见间。
workQueue:在任務(wù)沒有執(zhí)行之前,用來保存任務(wù)的隊(duì)列
threadFactory:用來創(chuàng)建線程的工廠
handler:當(dāng)達(dá)到線程的邊界和隊(duì)列的容量時(shí)執(zhí)行被阻塞,這個(gè)時(shí)候handler就會(huì)被用到
接下來看常用的execute方法:
1捆昏、如果線程的數(shù)量小于corePoolSize,試圖創(chuàng)建一個(gè)新線程毙沾,將command作為它的第一個(gè)任務(wù)骗卜。調(diào)用addWorker時(shí)自動(dòng)檢查運(yùn)行狀態(tài)和工作線程數(shù)量,以便于防止在不能添加線程時(shí)添加了線程左胞。當(dāng)線程數(shù)量>=corePoolSize或者添加核心線程失敗時(shí)走2寇仓,3
2、如果一個(gè)任務(wù)可以成功的加入到隊(duì)列烤宙,我們需要再次檢查是否應(yīng)該添加一個(gè)線程遍烦,因?yàn)樵俅螜z查時(shí),已經(jīng)存在的線程可能已經(jīng)不在運(yùn)行了躺枕。所以我們需要重新檢查線程池狀態(tài)服猪,如果已經(jīng)不在運(yùn)行供填,就需要將該任務(wù)從任務(wù)隊(duì)列刪除“罩恚或者在沒有線程的時(shí)候創(chuàng)建一個(gè)新的線程捕虽。
3、如果我們無法加入隊(duì)列坡脐,我們?cè)噲D添加一個(gè)新的非核心線程泄私。如果失敗,我們就知道線程池已經(jīng)關(guān)閉或者已經(jīng)飽和了备闲,因此拒絕執(zhí)行該任務(wù)晌端。
在圖2中的addWorker方法中可以看到線程池的狀態(tài)處于RUNNING和線程數(shù)沒有達(dá)到最大容量且工作線程的數(shù)量小于(核心線程?核心線程數(shù):最大線程數(shù))時(shí)就可以將該線程加入到工作線程中恬砂,同時(shí)啟動(dòng)該線程咧纠。其中Thread的源碼可以參考Thread源碼 - 簡(jiǎn)書