0

設置線程池配置時,如何選擇正確的RejectedExecutionHandlerRejectedExecutionHandler - CallerRunsPolicy vs AbortPolicy

我有一個發佈事件的遺留應用程序(這些事件可能在本地使用或可能被遠程進程佔用)。目前,政策是放棄,導致很多例外和錯過的事件。我們將同步隊列傳遞給線程池執行器。

我正在考慮將RejectedExecutionHandler更改爲呼叫者運行策略。這可能意味着調用者在達到線程綁定和隊列容量時花費時間運行該任務。我沒有看到任何問題。

到目前爲止,您的經驗是什麼?此外,使用無界隊列意味着沒有實用程序RejectedExecutionHandler

回答

1

我想你已經熟悉了不同的 ThreadPoolExecutor

RejectedExecutionHandlersThreadPoolExecutor.CallerRunsPolicy,即調用execute本身運行任務的線程。這提供了一個簡單的反饋控制機制,可以減慢提交新任務的速度。

這會影響應用程序的整體性能。如果您的應用程序可以承受此延遲(非實時和批處理,非交互式和脫機),則可以使用此策略。如果你買不起延遲和罰款丟棄任務,你可以去ThreadPoolExecutor.DiscardPolicy

是使用無界隊列裝置,用來RejectedExecutionHandler無市?

是的。無界隊列意味着沒有實用程序RejectedExecutionHandler。當您使用無界隊列時,請確保您的應用程序吞吐量受控於內存CPU利用率。如果您在該任務中使用較少內存佔用的數據提交短期任務,則可以使用無限制隊列。

+0

但是,感謝您的回答,「如果您無法承受延遲並罰款放棄該任務」或「非實時和批處理,非交互和脫機」不相關,並且大部分時間您都不想。我正在尋找使用案例,您可以選擇放棄策略,以及如果任務被拒絕,您希望任務提交者執行什麼操作。 – GauravJ

+0

如果必須處理拒絕任務,則CallerRunsPolicy策略是唯一以系統吞吐量爲代價的解決方案。其他解決方案會持續這些事件並稍後在不同的ThreadPoolExecutor中處理它們 –

相關問題