深入淺出多線程(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è)計。
對于可配置可管理的需求,至少的提供以下的功能點:
2.上面就這些對于我們使用者而言,對線程池的需求,下面我們分析Concurrent包提供的線程池是否達到了我們的需求。
對于易用的需求。
Concurrent的Executors類,注意不是Executor接口,通過Factory模式提供了我們以下的基本的線程池,如果沒有
特殊的需求,只需查閱這幾個線程池JDK文檔,就可以使用了。
對于可配置,可管理講:
線程對象的創(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è)計。
- 線程池需求
對于可配置可管理的需求,至少的提供以下的功能點:
- 線程池里,線程數(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提供的功能,但更完善,我會在隨后的深入淺出系列討論其不同 點。
對于可配置,可管理講:
- 提供了可以配置線程池中線程的數(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
posted on 2008-09-06 23:01 advincenting 閱讀(2005) 評論(0) 編輯 收藏