在设置线程池配置时,如何选择正确的RejectedExecutionHandler
?
我有一个发布事件的遗留应用程序(这些事件可以在本地使用,也可以由远程进程使用)。目前,政策是中止,这会导致很多异常和错过的事件。我们将同步队列传递给线程池执行器。
我正在考虑将 RejectedExecutionHandler
更改为调用者运行策略。这可能意味着当达到线程绑定(bind)和队列容量时,调用者会花时间运行该任务。我认为这没有任何问题。
到目前为止,您的体验如何?此外,使用无界队列是否意味着 RejectedExecutionHandler
没有实用程序?
最佳答案
我认为您已经熟悉 ThreadPoolExecutor 的不同 RejectedExecutionHandlers
In ThreadPoolExecutor.CallerRunsPolicy, the thread that invokes execute itself runs the task. This provides a simple feedback control mechanism that will slow down the rate that new tasks are submitted.
它会影响应用程序的整体性能。如果您的应用程序可以承受这种延迟(非实时和批处理、非交互式和离线),您可以使用此策略。如果你不能承受延迟和丢弃该任务的罚款,你可以去 ThreadPoolExecutor.DiscardPolicy
Is using unbounded queue means no utility for RejectedExecutionHandler?
是的。无界队列意味着 RejectedExecutionHandler
没有实用程序。当您使用无限队列时,请确保您的应用程序吞吐量在内存 和CPU 利用率方面受到控制。如果您要提交持续时间短且任务中数据内存占用较少的任务,则可以使用无界队列。
关于java - RejectedExecutionHandler - CallerRunsPolicy 与 AbortPolicy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46064786/