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

線程池的工做原理
一個線程池管理了一組工做線程, 同時它還包括了一個用於放置等待執行算法

任務的任務隊列(阻塞隊列) 。多線程

一個線程池管理了一組工做線程, 同時它還包括了一個用於放置等待執行併發

任務的任務隊列(阻塞隊列) 。性能

默認狀況下, 在建立了線程池後, 線程池中的線程數爲 0。 當任務提交給學習

線程池以後的處理策略以下:線程

1 若是此時線程池中的數量小於 corePoolSize(核心池的大小) , 即便線程池中的線程都處於空閒狀態, 也要建立新的線程來處理被添加的任務(也就是每來一個任務, 就要建立一個線程來執行任務) 。
2 若是此時線程池中的數量大於等於 corePoolSize, 可是緩衝隊列workQueue 未滿, 那麼任務被放入緩衝隊列, 則該任務會等待空閒線程將其取出去執行。
3 若是此時線程池中的數量大於等於 corePoolSize , 緩 衝 隊 列workQueue 滿, 而且線程池中的數量小於 maximumPoolSize(線程池最大線程數) , 建新的線程來處理被添加的任務。
4 若是 此時 線程 池中 的數量 大 於 等 於 corePoolSize, 緩 衝 隊列workQueue 滿, 而且線程池中的數量等於 maximumPoolSize, 那麼經過RejectedExecutionHandler 所指定的策略(任務拒絕策略)來處理此任務。也就是處理任務的優先級爲: 核心線程 corePoolSize、 任務隊列workQueue、 最大線程 maximumPoolSize, 若是三者都滿了, 使用handler 處理被拒絕的任務。隊列

  1. 特別注意, 在 corePoolSize 和 maximumPoolSize 之間的線程數會被自動釋放。 當線程池中線程數量大於 corePoolSize 時, 若是某線程空閒時間超過 keepAliveTime, 線程將被終止, 直至線程池中的線程數目不大於 corePoolSize。 這樣, 線程池能夠動態的調整池中的線程數。

使用線程池的好處內存

  • 1.經過重複利用已建立的線程, 減小在建立和銷燬線程上所花的時間以及系統資源的開銷。
  • 2.提升響應速度。 當任務到達時, 任務能夠不須要等到線程建立就能夠當即行。
  • 3.提升線程的可管理性。 使用線程池能夠對線程進行統一的分配和監控。
  • 4.若是不使用線程池, 有可能形成系統建立大量線程而致使消耗完系統內存。
    線程池的注意事項

雖然線程池是構建多線程應用程序的強大機制, 但使用它並非沒有風險的。資源

(1) 線程池的大小。 多線程應用並不是線程越多越好, 須要根據系統運行的軟硬件環境以及應用自己的特色決定線程池的大小。 通常來講, 若是代碼結構合理的話, 線程數目與 CPU數量相適合便可。 若是線程運行時可能出現阻塞現象, 可相應增長池的大小; 若有必要可採用自適應算法來動態調整線程池的大小, 以提升 CPU 的有效利用率和系統的總體性能。io

(2) 併發錯誤。 多線程應用要特別注意併發錯誤, 要從邏輯上保證程序的正確性, 注意避免死鎖現象的發生。

(3) 線程泄漏。 這是線程池應用中一個嚴重的問題, 當任務執行完畢而線程沒能返回池中就會發生線程泄漏現象。

學習交流羣:669823128

相關文章
相關標籤/搜索