1. 程式人生 > >實現Spring整合執行緒池ThreadPoolTaskExecutor

實現Spring整合執行緒池ThreadPoolTaskExecutor

在之前的專案裡面用到了執行緒池的功能,這裡記錄一下。

我們為什麼要實現執行緒池,下面是我百度查的:

在Java中,如果每當一個請求到達就建立一個新執行緒,開銷是相當大的。在實際使用中,每個請求建立新執行緒的伺服器在建立和銷燬執行緒上花費的時間和消耗的系統資源,甚至可能要比花在處理實際的使用者請求的時間和資源要多得多。除了建立和銷燬執行緒的開銷之外,活動的執行緒也需要消耗系統資源。如果在一個JVM裡建立太多的執行緒,可能會導致系統由於過度消耗記憶體或“切換過度”而導致系統資源不足。為了防止資源不足,伺服器應用程式需要一些辦法來限制任何給定時刻處理的請求數目,儘可能減少建立和銷燬執行緒的次數,特別是一些資源耗費比較大的執行緒的建立和銷燬,儘量利用已有物件來進行服務,這就是“池化資源”技術產生的原因。 


執行緒池主要用來解決執行緒生命週期開銷問題和資源不足問題。通過對多個任務重用執行緒,執行緒建立的開銷就被分攤到了多個任務上了,而且由於在請求到達時執行緒已經存在,所以消除了執行緒建立所帶來的延遲。這樣,就可以立即為請求服務,使應用程式響應更快。另外,通過適當地調整執行緒池中的執行緒數目可以防止出現資源不足的情況

確實,在專案中如果業務上需要單獨建立一個執行緒來查詢或更新某個邏輯,可能會新建一個執行緒來實現,但是當請求量增大時,對虛擬機器的消耗是非常大的,我們使用執行緒池來優化避免請求過多導致資源崩潰。

下面就是我做的一個簡單例子,:

我的例子是maven專案:所以我們需要新增相應的依賴,


下面是我們的配置:


上面標註的這四項的具體作用,線上程池中的流程:

  • 如果當前執行的執行緒數小於corePoolSize,那麼就建立執行緒來執行任務(執行時需要獲取全域性鎖)。
  • 如果執行的執行緒大於或等於corePoolSize,那麼就把task加入BlockQueue。
  • 如果建立的執行緒數量大於BlockQueue的最大容量,那麼建立新執行緒來執行該任務。
  • 如果建立執行緒導致當前執行的執行緒數超過maximumPoolSize,就根據飽和策略來拒絕該任務
解釋:說白了,就是:當一個執行緒進來,判斷當前執行的執行緒數是不是比核心執行緒數小,如果小於,那就建立執行緒執行,如果大於等於核心執行緒數,那麼就應該將執行緒任務放到任務佇列裡去,但是呢我們先得判斷,佇列是不是滿了,如果沒有滿,就放進去,繼續等待,如果滿了,那我們就只能硬著頭皮建立新的執行緒。但是如果當前執行緒池的最大容納執行緒數已經達到最高標準maximumPoolSize,相當於水池中的水滿了,我們蓄水的桶(相當於佇列)也滿了,我們所以就沒地方裝水了,所以就得拒絕這次任務。那就是不接收建立也就是線面的拒絕策略。---如何放棄。如果說沒有達到,我們的蓄水桶滿了,但是水池沒滿,我們

可以直接將水倒入池中,也就是新建任務執行緒。

下面我們就是上程式碼:

         


執行後的結果:


這個只是簡單的執行緒池使用,還有一些複雜的執行緒池,比如終止執行緒等一些處理,當然也得遇到不同的業務場景。後續新增一些執行緒的處理作為記錄學習。。。

參考:http://blog.csdn.net/foreverling/article/details/78073105