Java線程池的工作原理,好處和注意事項

線程池的工作原理


一個線程池管理了一組工作線程, 同時它還包括了一個用于放置等待執(zhí)行
任務的任務隊列(阻塞隊列) 。

一個線程池管理了一組工作線程, 同時它還包括了一個用于放置等待執(zhí)行
任務的任務隊列(阻塞隊列) 。

默認情況下, 在創(chuàng)建了線程池后, 線程池中的線程數(shù)為 0。 當任務提交給
線程池之后的處理策略如下:

  1. 如果此時線程池中的數(shù)量小于 corePoolSize(核心池的大小) , 即使線程池中的線程都處于空閑狀態(tài), 也要創(chuàng)建新的線程來處理被添加的任務(也就是每來一個任務, 就要創(chuàng)建一個線程來執(zhí)行任務) 。

  2. 如果此時線程池中的數(shù)量大于等于 corePoolSize, 但是緩沖隊列workQueue 未滿, 那么任務被放入緩沖隊列, 則該任務會等待空閑線程將其取出去執(zhí)行。

  3. 如 果 此 時 線 程 池 中 的 數(shù) 量 大 于 等 于 corePoolSize , 緩 沖 隊 列workQueue 滿, 并且線程池中的數(shù)量小于 maximumPoolSize(線程池最大線程數(shù)) , 建新的線程來處理被添加的任務。

  4. 如果 此時 線程 池中 的數(shù)量 大 于 等 于 corePoolSize, 緩 沖 隊列workQueue 滿, 并且線程池中的數(shù)量等于 maximumPoolSize, 那么通過RejectedExecutionHandler 所指定的策略(任務拒絕策略)來處理此任務。也就是處理任務的優(yōu)先級為: 核心線程 corePoolSize、 任務隊列workQueue、 最大線程 maximumPoolSize, 如果三者都滿了, 使用handler 處理被拒絕的任務。

5. 特別注意, 在 corePoolSize 和 maximumPoolSize 之間的線程數(shù)會被自動釋放。 當線程池中線程數(shù)量大于 corePoolSize 時, 如果某線程空閑時間超過 keepAliveTime, 線程將被終止, 直至線程池中的線程數(shù)目不大于 corePoolSize。 這樣, 線程池可以動態(tài)的調(diào)整池中的線程數(shù)。

使用線程池的好處

  • 1.通過重復利用已創(chuàng)建的線程, 減少在創(chuàng)建和銷毀線程上所花的時間以及系統(tǒng)資源的開銷。
  • 2.提高響應速度。 當任務到達時, 任務可以不需要等到線程創(chuàng)建就可以立即行。
  • 3.提高線程的可管理性。 使用線程池可以對線程進行統(tǒng)一的分配和監(jiān)控。
  • 4.如果不使用線程池, 有可能造成系統(tǒng)創(chuàng)建大量線程而導致消耗完系統(tǒng)內(nèi)存。

線程池的注意事項

雖然線程池是構(gòu)建多線程應用程序的強大機制, 但使用它并不是沒有風險的。
(1) 線程池的大小。 多線程應用并非線程越多越好, 需要根據(jù)系統(tǒng)運行的軟硬件環(huán)境以及應用本身的特點決定線程池的大小。 一般來說, 如果代碼結(jié)構(gòu)合理的話, 線程數(shù)目與 CPU數(shù)量相適合即可。 如果線程運行時可能出現(xiàn)阻塞現(xiàn)象, 可相應增加池的大小; 如有必要可采用自適應算法來動態(tài)調(diào)整線程池的大小, 以提高 CPU 的有效利用率和系統(tǒng)的整體性能。
(2) 并發(fā)錯誤。 多線程應用要特別注意并發(fā)錯誤, 要從邏輯上保證程序的正確性, 注意避免死鎖現(xiàn)象的發(fā)生。
(3) 線程泄漏。 這是線程池應用中一個嚴重的問題, 當任務執(zhí)行完畢而線程沒能返回池中就會發(fā)生線程泄漏現(xiàn)象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容