ThreadPoolExecutor
主要參數:
- corePoolSize
線程池核心大小,當從沒有任務到新任務進入時線程從0上漲到coreSize
- maximumPoolSize
線程池queue滿后新建線程到maxSize為止
- keepAliveTime
線程無工作后開始計時,如果時間大于keepAliveTime并且總線程數大于coreSize則被回收
- BlockingQueue<Runnable> workQueue
工作隊列,由用戶自定義,不同的QUEUE代表了不同的處理方式
- ThreadFactory
線程工廠,一般用默認的
- RejectedExecutionHandler
當隊列滿,線程池滿后的異常狀況處理,默認拋rejectexecutionException
核心代碼:
image.png
中間這步比較特殊,是當前工作線程為空,但是還有任務在隊列中則新建一個線程。
常用:
FixedThreadPool
特點
- corePoolSize=maximumPoolSize
- 使用LinkedBlockingQueue 無界,緩沖隊列
- 無等待(idel)時間,如果隊列為空立即返回
- 數目固定的線程池,當到達coresize后不會銷毀,一直等待
使用問題:
固定的線程數,無界的Queue,當有大量任務時,queue過長可能導致oom
CachedThreadPool
特點
- 最小線程數0,最大線程數Integer.MAX
- 使用SynchronousQueue 無界 無緩沖 等待隊列
- 元素添加后必須等待其被取出才能繼續放入(可以認為緩存值為1的阻塞隊列)
- 當某個線程60秒未被使用則移除,(圖一中workQueue.poll等待60秒,超時返回null,則圖2中的循環退出,相應worker結束
使用問題:
當前面線程沒有結束時,會一直創建新線程一直到Integer.MAX,然后queue進入等待,
一般會直接導致線程不夠用
線程池伸縮會很厲害,極限范圍0—Integer.MAX
適用于快速失敗的情況