ThreadPoolExecutor
主要參數(shù):
- corePoolSize
線程池核心大小,當(dāng)從沒有任務(wù)到新任務(wù)進(jìn)入時(shí)線程從0上漲到coreSize
- maximumPoolSize
線程池queue滿后新建線程到maxSize為止
- keepAliveTime
線程無工作后開始計(jì)時(shí)舔箭,如果時(shí)間大于keepAliveTime并且總線程數(shù)大于coreSize則被回收
- BlockingQueue<Runnable> workQueue
工作隊(duì)列,由用戶自定義崭放,不同的QUEUE代表了不同的處理方式
- ThreadFactory
線程工廠哟楷,一般用默認(rèn)的
- RejectedExecutionHandler
當(dāng)隊(duì)列滿赌渣,線程池滿后的異常狀況處理晓淀,默認(rèn)拋rejectexecutionException
核心代碼:
image.png
中間這步比較特殊怜瞒,是當(dāng)前工作線程為空,但是還有任務(wù)在隊(duì)列中則新建一個(gè)線程止潮。
常用:
FixedThreadPool
特點(diǎn)
- corePoolSize=maximumPoolSize
- 使用LinkedBlockingQueue 無界窃判,緩沖隊(duì)列
- 無等待(idel)時(shí)間,如果隊(duì)列為空立即返回
- 數(shù)目固定的線程池沽翔,當(dāng)?shù)竭_(dá)coresize后不會(huì)銷毀兢孝,一直等待
使用問題:
固定的線程數(shù),無界的Queue仅偎,當(dāng)有大量任務(wù)時(shí),queue過長可能導(dǎo)致oom
CachedThreadPool
特點(diǎn)
- 最小線程數(shù)0雳殊,最大線程數(shù)Integer.MAX
- 使用SynchronousQueue 無界 無緩沖 等待隊(duì)列
- 元素添加后必須等待其被取出才能繼續(xù)放入(可以認(rèn)為緩存值為1的阻塞隊(duì)列)
- 當(dāng)某個(gè)線程60秒未被使用則移除,(圖一中workQueue.poll等待60秒橘沥,超時(shí)返回null,則圖2中的循環(huán)退出夯秃,相應(yīng)worker結(jié)束
使用問題:
當(dāng)前面線程沒有結(jié)束時(shí)座咆,會(huì)一直創(chuàng)建新線程一直到Integer.MAX,然后queue進(jìn)入等待痢艺,
一般會(huì)直接導(dǎo)致線程不夠用
線程池伸縮會(huì)很厲害,極限范圍0—Integer.MAX
適用于快速失敗的情況