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

來源:互聯網
上載者:User
本系列文章導航

深入淺出Java多線程(1)-方法 join

深入淺出Java多線程(2)-Swing中的EDT(事件分發線程)

深入淺出多線程(3)-Future非同步模式以及在JDK1.5Concurrent包中的實現

深入淺出多線程(4)對CachedThreadPool OutOfMemoryError難題的一些想法

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

深入淺出多線程(6)分析並行包線程池的設計與實現

 

  接深入淺出多線程系列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來配置擴充來實現個人化需求的線程池。

 

博文來源:http://www.cqzol.com/programming/580436.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.