RejectedExecutionHandler - CallerRunsPolicy 与 AbortPolicy

Gau*_*avJ 3 java multithreading java.util.concurrent threadpoolexecutor

在设置线程池配置时,如何选择正确的RejectedExecutionHandler

我有一个发布事件的遗留应用程序(这些事件可以在本地使用,也可以由远程进程使用)。目前,策略是中止,这会导致许多异常和错过的事件。我们将同步队列传递给线程池执行器。

我正在考虑更改RejectedExecutionHandler调用方运行策略。这可能意味着当达到线程限制和队列容量时,调用者会花时间运行该任务。我看不出有什么问题。

到目前为止,您的体验如何?另外,使用无界队列是否意味着没有效用RejectedExecutionHandler

Rav*_*abu 6

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

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

它会影响应用程序的整体性能。如果您的应用程序可以承受这种延迟(非实时和批处理非交互式和离线),您可以使用此策略。如果您负担不起延迟并且放弃该任务很好,您可以选择ThreadPoolExecutor.DiscardPolicy

使用无界队列是否意味着 RejectedExecutionHandler 没有效用?

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