邏輯劃分線程池 – JAVA編程語言程序開發技術文章

現在很多系統中,特別是事件驅動的系統中,對於線程池的維護很多時候根據業務處理類型的不同做劃分和管理,但分開維護會帶來下面兩個問題: 

1. 到處線程池,每個線程池都有上限設置,但是所有線程池到達上限的時候也許系統已經無法承受瞭,所以局部設計和限制無法達到全局限制的目標。


2. 合理的利用線程池的資源,當線程池邏輯上真實隔離後,就無法將空閑的線程資源借調給繁忙的任務處理使用。


設計中關註的:


  虛擬隔離線程池需要有模型可以保證對於一些處理的保護,對於一些處理的降級。


設計思路:


  簡單的兩種配置模式:保留,限制。


舉個例子:


  默認線程池大小設置為100。


    A類任務設置為保留10,B類任務設置為限制50。


  假設有A,B,C三種任務進入。


    A最大可以使用100個線程,其中10個是它獨占的(通過配置可以選擇優先使用公有的還是私有的)


    B最大可以使用50個線程,當公有線程(100-10=90)被消耗後剩餘總數小於50,那麼B消耗的數量就會小於50,假如公有90個線程都沒有被消耗,此時B最多也隻能消耗50個線程。總結來說,B消耗公有的線程資源,同時最多隻能消耗他的設置(當然他設置如果超過公有線程,則以公有線程池最大作為上限)


    C最大可以使用90個線程,也就是所有的公有線程。


當任何一種請求沒有線程資源可以被使用的時候,將會被放入隊列,等待線程可用,隊列不區分任務類型。


    第一版簡單的Java代碼參看:點此下載  


        這裡隻是探討一種簡單的設計思路,以最小代價來全局化管理維護線程池或者資源池。

發佈留言