1. 程式人生 > >線程池工作隊列飽和策略

線程池工作隊列飽和策略

高負載 java線程池 sca ted 可能 內存耗盡 caller body 策略

線程池工作隊列飽和策略

Java線程池會將提交的任務先置於工作隊列中,在從工作隊列中獲取(SynchronousQueue直接由生產者提交給工作線程)。

那麽工作隊列就有兩種實現策略:無界隊列和有界隊列。

無界隊列不存在飽和的問題,但是其問題是當請求持續高負載的話,任務會無腦的加入工作隊列,那麽很可能導致內存等資源溢出或者耗盡。

而有界隊列不會帶來高負載導致的內存耗盡的問題,但是有引發工作隊列已滿情況下,新提交的任務如何管理的難題,這就是線程池工作隊列飽和策略要解決的問題。

無界隊列不存在飽和的問題,但是其問題是當請求持續高負載的話,任務會無腦的加入工作隊列,那麽很可能導致內存等資源溢出或者耗盡。

而有界隊列不會帶來高負載導致的內存耗盡的問題,但是有引發工作隊列已滿情況下,新提交的任務如何管理的難題,這就是線程池工作隊列飽和策略要解決的問題。

飽和策略分為:Abort 策略, CallerRuns 策略,Discard策略,DiscardOlds策略。

當工作隊列滿了,不同策略的處理方式為:

1.Abort策略:默認策略,新任務提交時直接拋出未檢查的異常RejectedExecutionException,該異常可由調用者捕獲。

當工作隊列滿了,不同策略的處理方式為:

1.Abort策略:默認策略,新任務提交時直接拋出未檢查的異常RejectedExecutionException,該異常可由調用者捕獲。

程序拋出了RejectedExecutionException

程序拋出了RejectedExecutionException

線程池工作隊列飽和策略