現在很多系統中,特別是事件驅動的系統中,對于線程池的維護很多時候根據業務處理類型的不同做劃分和管理,但分開維護會帶來下面兩個問題:
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代碼參看:http://www.rayfile.com/zh-cn/files/66a89e61-4357-11e0-9ad5-0015c55db73d/
這里只是探討一種簡單的設計思路,以最小代價來全局化管理維護線程池或者資源池。