在设置线程池配置时,如何选择正确的RejectedExecutionHandler
?
我有一个遗留应用程序来发布事件(这些事件可以在本地使用,也可以由远程进程使用)。目前,政策是中止,导致许多例外和错过事件。我们将同步队列传递给线程池执行器。
我正在考虑将RejectedExecutionHandler
更改为调用者运行策略。这可能意味着当达到线程绑定和队列容量时,调用者花费时间运行该任务。我没有看到任何问题。
到目前为止,您的经历是什么?此外,使用无界队列意味着RejectedExecutionHandler
没有效用吗?
答案 0 :(得分:3)
我认为您已经熟悉 ThreadPoolExecutor
的RejectedExecutionHandlers
个RejectedExecutionHandler
在ThreadPoolExecutor.CallerRunsPolicy中,调用execute本身的线程运行任务。这提供了一种简单的反馈控制机制,可以降低新任务的提交速度。
它会影响您的应用程序的整体性能。如果您的应用程序可以承受此延迟(非实时和批处理,非交互式和脱机),则可以使用此策略。如果您无法承担拖延和完成任务的延迟和罚款,您可以选择ThreadPoolExecutor.DiscardPolicy
使用无界队列意味着RejectedExecutionHandler没有实用工具吗?
是。无界队列意味着"""
This is a reST style.
:param param1: this is a first param
:param param2: this is a second param
:returns: this is a description of what is returned
:raises keyError: raises an exception
"""
无效。当您使用无界队列时,请确保您的应用程序吞吐量受内存和 CPU 利用率的控制。如果要在该任务中提交数据内存占用较少的短期任务,则可以使用无界队列。