線程池工作隊列飽和策略
阿新 • • 發佈:2018-03-23
高負載 java線程池 sca ted 可能 內存耗盡 caller body 策略
線程池工作隊列飽和策略
Java線程池會將提交的任務先置於工作隊列中,在從工作隊列中獲取(SynchronousQueue直接由生產者提交給工作線程)。
那麽工作隊列就有兩種實現策略:無界隊列和有界隊列。
無界隊列不存在飽和的問題,但是其問題是當請求持續高負載的話,任務會無腦的加入工作隊列,那麽很可能導致內存等資源溢出或者耗盡。
而有界隊列不會帶來高負載導致的內存耗盡的問題,但是有引發工作隊列已滿情況下,新提交的任務如何管理的難題,這就是線程池工作隊列飽和策略要解決的問題。
無界隊列不存在飽和的問題,但是其問題是當請求持續高負載的話,任務會無腦的加入工作隊列,那麽很可能導致內存等資源溢出或者耗盡。
而有界隊列不會帶來高負載導致的內存耗盡的問題,但是有引發工作隊列已滿情況下,新提交的任務如何管理的難題,這就是線程池工作隊列飽和策略要解決的問題。
飽和策略分為:Abort 策略, CallerRuns 策略,Discard策略,DiscardOlds策略。
當工作隊列滿了,不同策略的處理方式為:
1.Abort策略:默認策略,新任務提交時直接拋出未檢查的異常RejectedExecutionException,該異常可由調用者捕獲。
當工作隊列滿了,不同策略的處理方式為:
1.Abort策略:默認策略,新任務提交時直接拋出未檢查的異常RejectedExecutionException,該異常可由調用者捕獲。
程序拋出了RejectedExecutionException
程序拋出了RejectedExecutionException
線程池工作隊列飽和策略