RejectedExecutionHandler - CallerRunsPolicy vs AbortPolicy

时间:2017-09-05 23:46:47

标签: java multithreading java.util.concurrent threadpoolexecutor

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

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

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

到目前为止,您的经历是什么?此外,使用无界队列意味着RejectedExecutionHandler没有效用吗?

1 个答案:

答案 0 :(得分:3)

我认为您已经熟悉 ThreadPoolExecutor

RejectedExecutionHandlersRejectedExecutionHandler
  

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 利用率的控制。如果要在该任务中提交数据内存占用较少的短期任务,则可以使用无界队列。