新的起點 新的開始

          快樂生活 !

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

           接上篇,在上篇中介紹了線程池的設計需求以及使用,在這里我們分析Concurrent包中線程池的實現類ThreadPoolExecutor的設計,是不是感覺沒意義,人家都實現了還分析啥?當然是提高我們自身的設計能力了。對于設計能力的提高,我認為一方面我們要在具體實踐中,能夠學習前人
          總結的設計思想(比如設計模式之類的),根據具體上下文,能夠融會貫通的使用他們。另一方面分析優秀的框架設計與實現也是很好的方式,當然JDK設計是最好的學習資料。閑話多了,切入主題,設計要點:
          1.     縱觀在JDK1.5以前我們自己實現的線程池,還是Concurrent提供的線程池,在線程池中首先我們要兩個容器維護    線程池中的線程 與     提交給線程池中的Task。
          2.     線程池與Task如何關聯,什么樣的Task才可以提交的該線程池中執行呢。所以我們要定義一個接口,分離線程池與具體
          3.     Task的耦合關系,ThreadPoolExecutor可以接受實現Runnable接口或者Callable接口(其實最后也是組裝為Runnable接口)的具體Task。
          4.    線程池中的線程從Task隊列中去Task執行。
              以上就是線程池設計的要點。
              在ThreadPoolExecutor中,有一個內部類Worker,實現了Runnable,也就是線程池中的線程,不言而喻,它的Run方法就是從Task隊列
             取Task,調用Task的run方法(Task 是實現了Runnable接口的),執行Task,依次類推,直到沒有隊列里面Task。看下圖
               了解了線程的創建以及執行Task的流程,下面讓我們在看看ThreadPoolExecutor是如何觸發創建線程池線程的呢? 何時啟動線程池里的
          線程執行Task呢?再這之前,我們先說明一下,在ThreadPoolExecutor中引入了兩個描述線程池中線程數量的屬性,corePoolSize和         maximumPoolSize
               corePoolSize 初始化時線程池中線程的數量。
              maximumPoolSize 線程池中的程的最大數量,當Task無法插入Task隊列,線程池線程數量又達到maximumPoolSize時,啟用Reject策略,
              Reject過多的Task。
          下圖說明了當我們創建一個線程池,并提交Task時,ThreadPoolExecutor首先判斷是否達到corePoolSize,沒有就在創建一個線程,提高吞吐量。如果超過那么直接將該Task插入Task隊列。
          如果插入失敗,說明Task隊列已滿,那么嘗試是否達到maximumPoolSize,如果沒有,那么創建而外的線程處理改
          Task,減低Task失敗率。
          如果已經達到了maximumPoolSize,對不起,只能Reject了。


          這其實是線程池設計處理Task的策略。大家可以細細體會,這個策略的優勢。
              到現在其實已經基本說明了ThreadPoolExecutor的設計了,其實設計思想是不是跟以前我們自個設計線程池都一樣?只是在具體實現上更加完善,更加完美!
          對了大家如果感興趣可以看看ThreadPoolExecutor如何優雅的Shutdown,這些設計實現細節,都可以在我們的實踐中應用。

          posted on 2008-09-06 23:14 advincenting 閱讀(2364) 評論(1)  編輯  收藏

          評論

          # re: 深入淺出多線程(6)分析并行包線程池的設計與實現 2009-03-27 14:46 wavefly

          corePoolSize 初始化時線程池中線程的數量。
          maximumPoolSize 線程池中的程的最大數量,當Task無法插入Task隊列,線程池線程數量又達到maximumPoolSize時,啟用Reject策略,

          這個Task隊列的空間大小是多少?maximumPoolSize - corePoolSize 的差值嗎?
          謝謝  回復  更多評論   


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


          網站導航:
           

          公告

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

          統計

          常用鏈接

          留言簿(13)

          隨筆分類(71)

          隨筆檔案(179)

          文章檔案(13)

          新聞分類

          IT人的英語學習網站

          JAVA站點

          優秀個人博客鏈接

          官網學習站點

          生活工作站點

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 隆德县| 凤山县| 铁岭县| 新平| 湖口县| 常德市| 达孜县| 工布江达县| 仙游县| 乌拉特后旗| 南平市| 海兴县| 甘德县| 商洛市| 淮南市| 静海县| 祁阳县| 信丰县| 宽甸| 通化市| 墨江| 兴城市| 汕头市| 家居| 黄山市| 连平县| 屯门区| 深州市| 吉水县| 栾川县| 同心县| 荃湾区| 广灵县| 台东市| 彩票| 永胜县| 龙州县| 富阳市| 黑山县| 咸阳市| 富锦市|