新的起點 新的開始

          快樂生活 !

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

          接深入淺出多線程系列4,
              線程對象的創(chuàng)建和銷毀是需要花費系統(tǒng)資源的,通過線程池,可以避免該問題并提高系統(tǒng)的響應(yīng)時間。這種情形類似我們常提到的數(shù)據(jù)庫連接池。

             線程池的廣泛應(yīng)用使得在SUN在JDK 1.5的工具包提供了線程池的支持。我計劃將該系列分為設(shè)計需求與設(shè)計實現(xiàn)兩個部分。這樣會更加清晰。如果想要熟悉,并熟練應(yīng)用線程池,那么通過設(shè)計需求篇也就是該篇就可以找到答案。如果想探究實現(xiàn)的細節(jié),那么在設(shè)計實現(xiàn)篇會有深入的說明。
             本文以Concurrent包線程池設(shè)計為例,討論線程池的設(shè)計。
          1. 線程池需求
              設(shè)計與實現(xiàn)的最終目標是滿足需求,這是軟件開發(fā)的基本原則。我們先考慮考慮對線程池的需求。作為一名開發(fā)人員,我們最主要的需求就是線程池簡單,易用。即使你的設(shè)計算法多么優(yōu)雅,但給使用者復(fù)雜的使用步驟也是得不償失,簡單就是美!最好我們不用深究你的具體實現(xiàn),通過簡單的接口就可以應(yīng)用。其次就是技術(shù)角度,線程池的設(shè)計應(yīng)該是比較柔性的,提供很好的可配置可管理與可擴張性。
              對于可配置可管理的需求,至少的提供以下的功能點:
          •   線程池里,線程數(shù)量的配置。
          •   能夠提供動態(tài)調(diào)整線程的數(shù)量。
          •   能夠Shutdown 最好能夠提供優(yōu)雅的Shundown,而不是像我們通過切斷電源關(guān)閉機器那樣粗暴的Shutdown。
          •   能夠提供Task的狀態(tài),比如完成了多少,還有多少沒有完成。
             對于可擴展性而言有以下幾點:
          •    如果不能滿足需要能夠很容易的擴展。
          •    對于線程池線程的創(chuàng)建能否提夠擴展。
          •    當提交的Task負載過大時,線程池的處理策略能否擴展。
               以上是對線程池的需求的討論。
              
            2.上面就這些對于我們使用者而言,對線程池的需求,下面我們分析Concurrent包提供的線程池是否達到了我們的需求。
                對于易用的需求。
                Concurrent的Executors類,注意不是Executor接口,通過Factory模式提供了我們以下的基本的線程池,如果沒有
                特殊的需求,只需查閱這幾個線程池JDK文檔,就可以使用了。
          •    newFixedThreadPool 顧名思義,建立固定大小的線程池。
          •    newCachedThreadPool 根據(jù)需要動態(tài)的創(chuàng)建線程,該線程池我們在深入系列4做了討論。
          •    newSingleThreadExecutor 如其名。
          •    newScheduledThreadPool  如其名,該線程池類似于JDK1.4 Timer提供的功能,但更完善,我會在隨后的深入淺出系列討論其不同    點。
                 總之,從易用性的角度見,Concurrent包提供的接口是不錯的。
                對于可配置,可管理講:
          •    提供了可以配置線程池中線程的數(shù)量的功能。比如在創(chuàng)建newFixedThreadPool時,第一個參數(shù)就是線程池線程的數(shù)量,通過
          •           該數(shù)量的配置,我們就可以保證不會因為線程的過多導(dǎo)致系統(tǒng)的崩潰。
          •    提供了在運行時通過setCorePoolSize和setMaximumPoolSize方法來調(diào)整線程池數(shù)量的功能,兩者的區(qū)別會在后續(xù)實現(xiàn)篇中說明。
          •    提夠了優(yōu)雅的Shutdown,不在接受Task,將正在運行的Task執(zhí)行完,處于等待狀態(tài)的Task 中斷。
          •     提供getTaskCount和getCompletedTaskCount方法可以獲取提交的Task和完成的Task數(shù)量。
                 對于可擴展性
          •     我們可以參考Executors的Factory模式,擴展提供滿足需要的線程池。
          •     在構(gòu)造方法中,提供ThreadFactory接口,我們可以實現(xiàn)自定義的創(chuàng)建線程池線程的方法。
          •     提供了RejectedExecutionHandler接口,我們可以擴張該接口,提供當Task過多時,處理策略,目前默認為AbortPolicy策略Throw 一個RejectedExecutionException
                 總之,Concurrent中Executors類通過Factory Method方法,提供了基本常用的線程池。 Executors 其實通過線程池實現(xiàn)類-ThreadPoolExecutor創(chuàng)建基本的線程池,所以我們可以通過ThreadPoolExecutor提供的API來配置擴展來實現(xiàn)個性化需求的線程池。
               

          posted on 2008-09-06 23:01 advincenting 閱讀(2005) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          公告

          Locations of visitors to this pageBlogJava
        1. 首頁
        2. 新隨筆
        3. 聯(lián)系
        4. 聚合
        5. 管理
        6. <2008年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          統(tǒng)計

          常用鏈接

          留言簿(13)

          隨筆分類(71)

          隨筆檔案(179)

          文章檔案(13)

          新聞分類

          IT人的英語學(xué)習(xí)網(wǎng)站

          JAVA站點

          優(yōu)秀個人博客鏈接

          官網(wǎng)學(xué)習(xí)站點

          生活工作站點

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 舞钢市| 阳朔县| 昌宁县| 洛浦县| 阿坝县| 哈巴河县| 商河县| 光泽县| 佳木斯市| 万荣县| 河西区| 色达县| 庆安县| 赞皇县| 冷水江市| 固镇县| 会东县| 肥城市| 新营市| 安阳县| 宾阳县| 杂多县| 辽阳县| 平阳县| 施秉县| 江华| 平谷区| 鄂尔多斯市| 神木县| 黔西| 新竹市| 酉阳| 唐海县| 新和县| 吐鲁番市| 青神县| 舟山市| 四子王旗| 广灵县| 陇南市| 宝兴县|