程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 深入淺出多線程(5)以並行包線程池為例說說線程池的設計需求及使用

深入淺出多線程(5)以並行包線程池為例說說線程池的設計需求及使用

編輯:關於JAVA

接深入淺出多線程系列4,

線程對象的創建和銷毀是需要花費系統資源的,通過線程池,可以避免該問 題並提高系統的響應時間。這種情形類似我們常提到的數據庫連接池。

線程池的廣泛應用使得在SUN在JDK 1.5的工具包提供了線程池的支持。我計 劃將該系列分為設計需求與設計實現兩個部分。這樣會更加清晰。如果想要熟悉 ,並熟練應用線程池,那麼通過設計需求篇也就是該篇就可以找到答案。如果想 探究實現的細節,那麼在設計實現篇會有深入的說明。

本文以Concurrent包線程池設計為例,討論線程池的設計。

線程池需求

設計與實現的最終目標是滿足需求,這是軟件開發的基本原則。我們先考慮 考慮對線程池的需求。作為一名開發人員,我們最主要的需求就是線程池簡單, 易用。即使你的設計算法多麼優雅,但給使用者復雜的使用步驟也是得不償失, 簡單就是美!最好我們不用深究你的具體實現,通過簡單的接口就可以應用。其 次就是技術角度,線程池的設計應該是比較柔性的,提供很好的可配置可管理與 可擴張性。

對於可配置可管理的需求,至少的提供以下的功能點:

線程池裡,線程數量的配置。

能夠提供動態調整線程的數量。

能夠Shutdown 最好能夠提供優雅的Shundown,而不是像我們通過切斷電源關 閉機器那樣粗暴的Shutdown。

能夠提供Task的狀態,比如完成了多少,還有多少沒有完成。

對於可擴展性而言有以下幾點:

如果不能滿足需要能夠很容易的擴展。

對於線程池線程的創建能否提夠擴展。

當提交的Task負載過大時,線程池的處理策略能否擴展。

以上是對線程池的需求的討論。

2.上面就這些對於我們使用者而言,對線程池的需求,下面我們分析 Concurrent包提供的線程池是否達到了我們的需求。

對於易用的需求。

Concurrent的Executors類,注意不是Executor接口,通過Factory模式提供 了我們以下的基本的線程池,如果沒有

特殊的需求,只需查閱這幾個線程池JDK文檔,就可以使用了。

newFixedThreadPool 顧名思義,建立固定大小的線程池。

newCachedThreadPool 根據需要動態的創建線程,該線程池我們在深入系列4 做了討論。

newSingleThreadExecutor 如其名。

newScheduledThreadPool 如其名,該線程池類似於JDK1.4 Timer提供的功 能,但更完善,我會在隨後的深入淺出系列討論其不同  點。

總之,從易用性的角度見,Concurrent包提供的接口是不錯的。

對於可配置,可管理講:

提供了可以配置線程池中線程的數量的功能。比如在創建 newFixedThreadPool時,第一個參數就是線程池線程的數量,通過

該數量的配置,我們就可以保證不會因為線程的過多導致系統的崩潰。

提供了在運行時通過setCorePoolSize和setMaximumPoolSize方法來調整線程 池數量的功能,兩者的區別會在後續實現篇中說明。

提夠了優雅的Shutdown,不在接受Task,將正在運行的Task執行完,處於等 待狀態的Task 中斷。

提供getTaskCount和getCompletedTaskCount方法可以獲取提交的Task和完成 的Task數量。

對於可擴展性

我們可以參考Executors的Factory模式,擴展提供滿足需要的線程池。

在構造方法中,提供ThreadFactory接口,我們可以實現自定義的創建線程池 線程的方法。

提供了RejectedExecutionHandler接口,我們可以擴張該接口,提供當Task 過多時,處理策略,目前默認為AbortPolicy策略Throw 一個 RejectedExecutionException

總之,Concurrent中Executors類通過Factory Method方法,提供了基本常用 的線程池。 Executors 其實通過線程池實現類-ThreadPoolExecutor創建基本的 線程池,所以我們可以通過ThreadPoolExecutor提供的API來配置擴展來實現個 性化需求的線程池。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved