java - RejectedExecutionHandler - CallerRunsPolicy 与 AbortPolicy

标签 java multithreading java.util.concurrent threadpoolexecutor

在设置线程池配置时,如何选择正确的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/

相关文章:

java - 有了HashMap和Concurrent HashMap,WeakHashMap有什么用?

java - Java Lock 是否有超时的实现

java - Eclipse插件热部署

java - Java 初学者编程 - 在对话框 (JOptionPane) 框中使用另一种方法的整数

java - 制作可双击的 Jython .jars

java - sleep 线程被中断导致与数据库的连接丢失

java - 拍打编译错误gradle Java构建

java - 一旦我将 Runnable 传递给不同线程中的 Swing 的 invokeAndWait ,就无法停止它

java - java中的中断处理

java - 我怎样才能使这段代码更并发?