RejectedExecutionHandler - CallerRunsPolicy vs AbortPolicy

RejectedExecutionHandler - CallerRunsPolicy vs AbortPolicy

问题描述:

设置线程池配置时,如何选择正确的RejectedExecutionHandlerRejectedExecutionHandler - CallerRunsPolicy vs AbortPolicy

我有一个发布事件的遗留应用程序(这些事件可能在本地使用或可能被远程进程占用)。目前,政策是放弃,导致很多例外和错过的事件。我们将同步队列传递给线程池执行器。

我正在考虑将RejectedExecutionHandler更改为呼叫者运行策略。这可能意味着调用者在达到线程绑定和队列容量时花费时间运行该任务。我没有看到任何问题。

到目前为止,您的经验是什么?此外,使用*队列意味着没有实用程序RejectedExecutionHandler

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

RejectedExecutionHandlersThreadPoolExecutor.CallerRunsPolicy,即调用execute本身运行任务的线程。这提供了一个简单的反馈控制机制,可以减慢提交新任务的速度。

这会影响应用程序的整体性能。如果您的应用程序可以承受此延迟(非实时和批处理,非交互式和脱机),则可以使用此策略。如果你买不起延迟和罚款丢弃任务,你可以去ThreadPoolExecutor.DiscardPolicy

是使用*队列装置,用来RejectedExecutionHandler无市?

是的。*队列意味着没有实用程序RejectedExecutionHandler。当您使用*队列时,请确保您的应用程序吞吐量受控于内存CPU利用率。如果您在该任务中使用较少内存占用的数据提交短期任务,则可以使用无限制队列。

+0

但是,感谢您的回答,“如果您无法承受延迟并罚款放弃该任务”或“非实时和批处理,非交互和脱机”不相关,并且大部分时间您都不想。我正在寻找使用案例,您可以选择放弃策略,以及如果任务被拒绝,您希望任务提交者执行什么操作。 – GauravJ

+0

如果必须处理拒绝任务,则CallerRunsPolicy策略是唯一以系统吞吐量为代价的解决方案。其他解决方案会持续这些事件并稍后在不同的ThreadPoolExecutor中处理它们 –