有時候花了大把時間去看一些東西卻看不懂,是很 “ 藍瘦 ” 的,花時間也是投資。
本文適合:
- 曾瞭解過線程池卻一直模模糊糊的人
- 瞭解得差不多卻對某些點依然疑惑的
不適合:
- 完全沒看過的,建議你先去看看其他基礎文章
- 看過,卻忘得差不多了,建議你先去回顧下
本文能給你的閱讀回報
- 適合的讀者,儘可能讓你徹底明白常用的線程池的知識相關點
- 不適合的讀者,能有個不錯的概念,神童另談
廢話少說,我們開始。下圖,皆可自行保存,常常閱之。日久,根深蒂固
默認構造函數
<code>public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { ....}/<runnable>/<code>
絕對易懂的構造方法參數講解
文字描述
corePoolSize,maximumPoolSize,workQueue之間關係。
- 當線程池中線程數小於corePoolSize時,新提交任務將創建一個新線程執行任務,即使此時線程池中存在空閒線程。
- 當線程池中線程數達到corePoolSize時,新提交任務將被放入workQueue中,等待線程池中任務調度執行 。
- 當workQueue已滿,且maximumPoolSize > corePoolSize時,新提交任務會創建新線程執行任務。
- 當workQueue已滿,且提交任務數超過maximumPoolSize,任務由RejectedExecutionHandler處理。
- 當線程池中線程數超過corePoolSize,且超過這部分的空閒時間達到keepAliveTime時,回收這些線程。
- 當設置allowCoreThreadTimeOut(true)時,線程池中corePoolSize範圍內的線程空閒時間達到keepAliveTime也將回收。
一般流程圖
newFixedThreadPool 流程圖
<code>public static ExecutorService newFixedThreadPool(int nThreads){ return new ThreadPoolExecutor( nThreads, // corePoolSize nThreads, // maximumPoolSize == corePoolSize 0L, // 空閒時間限制是 0 TimeUnit.MILLISECONDS, new LinkedBlockingQueue<runnable>() // 無界阻塞隊列 );}/<runnable>/<code>
newCacheThreadPool 流程圖
<code>public static ExecutorService newCachedThreadPool(){ return new ThreadPoolExecutor( 0, // corePoolSoze == 0 Integer.MAX_VALUE, // maximumPoolSize 非常大 60L, // 空閒判定是60 秒 TimeUnit.SECONDS, // 神奇的無存儲空間阻塞隊列,每個 put 必須要等待一個 take new SynchronousQueue<runnable>() );}/<runnable>/<code>
newSingleThreadPool 流程圖
<code>public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService ( new ThreadPoolExecutor ( 1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<runnable>(), threadFactory ) ); }/<runnable>/<code>
可以看到除了多了個 FinalizableDelegatedExecutorService 代理,其初始化和 newFiexdThreadPool 的 nThreads = 1 的時候是一樣的。
區別就在於:
- newSingleThreadExecutor返回的ExcutorService在析構函數finalize()處會調用shutdown()
- 如果我們沒有對它調用shutdown(),那麼可以確保它在被回收時調用shutdown()來終止線程。
使用ThreadFactory,可以改變線程的名稱、線程組、優先級、守護進程狀態,一般採用默認。
流程圖略,請參考 newFiexdThreadPool,這裡不再累贅。
最後
還有一個定時任務線程池ScheduledThreadPool
它用來處理延時或定時任務,不常用
(完)
閱讀更多 一隻程序哼 的文章
關鍵字: maximumPoolSize public 任務