博客
关于我
四种线程池拒绝策略
阅读量:203 次
发布时间:2019-02-28

本文共 1846 字,大约阅读时间需要 6 分钟。

线程池拒绝策略深入解析

在线程池管理中,拒绝策略是处理任务过载情况的重要机制。线程池在任务数量超过其容量时,会根据配置的策略对超出任务进行处理。以下将详细介绍线程池的四种拒绝策略及其适用场景。

1. AbortPolicy(默认策略)

描述:

AbortPolicy是线程池默认的拒绝策略。当线程池的任务缓存队列已满且线程数达到最大值时,新任务将被丢弃,并抛出RejectedExecutionException异常。

特点:

  • 丢弃任务。
  • 抛出异常。
  • 适用于关键业务场景,能及时反馈系统过载状态。

示例:

在一个高并发的数据处理系统中,使用AbortPolicy可以确保系统在任务过载时快速失败,并通过异常提示管理员进行干预。


2. DiscardPolicy

描述:

DiscardPolicy策略会将任务静默丢弃,不抛出异常。如果线程池已满,后续任务将被丢弃,不会有任何异常信息。

特点:

  • 不抛出异常。
  • 静默丢弃任务。
  • 适用于对异常不敏感的业务场景。

示例:

在博客网站的阅读量统计功能中,采用DiscardPolicy可以避免服务器过载,并不影响用户体验。


3. DiscardOldestPolicy

描述:

DiscardOldestPolicy策略会丢弃队列中最前面的任务,然后重新提交被拒绝的任务(除非线程池已关闭)。

特点:

  • 喜新厌旧,优先丢弃旧任务。
  • 可能导致部分任务重复提交。
  • 适用于允许任务重复提交的场景。

示例:

在某些实时监控系统中,DiscardOldestPolicy可以避免长时间任务积累,同时确保关键任务能及时执行。


4. CallerRunsPolicy

描述:

CallerRunsPolicy策略会将被拒绝的任务直接由提交线程执行,避免线程池负载过重。

特点:

  • 任务由提交线程直接处理。
  • 不会增加线程池的负载。
  • 适用于对任务延迟敏感的场景。

示例:

在网络爬虫或实时数据处理任务中,CallerRunsPolicy可以防止任务被拖延,确保数据处理的及时性。


线程池默认拒绝策略

在线程池初始化时,默认的拒绝策略是AbortPolicy。通过查看ThreadPoolExecutor类的源码,可以看到:

private static final RejectedExecutionHandler defaultHandler = new AbortPolicy();

这表明,默认情况下,线程池会采用丢弃任务并抛出异常的策略。通过自定义线程池配置,我们可以根据需求更改拒绝策略。


自定义线程池拒绝策略

在实际开发中,可以通过线程池的构造方法或 setter方法来配置拒绝策略。例如,在Spring框架中,可以使用ThreadPoolTaskExecutor:

@Configurationpublic class TaskExecutorConfig implements AsyncConfigurer {    @Override    public Executor getAsyncExecutor() {        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();        taskExecutor.setCorePoolSize(5);        taskExecutor.setMaxPoolSize(5);        taskExecutor.setQueueCapacity(1000);        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());        taskExecutor.initialize();        return taskExecutor;    }}

拒绝策略的选择要点

  • AbortPolicy:推荐用于关键业务,确保系统状态可控。
  • DiscardPolicy:适用于对异常不敏感的场景,静默处理任务过载。
  • DiscardOldestPolicy:适用于允许任务重复提交的场景,避免长时间任务积累。
  • CallerRunsPolicy:用于对任务延迟敏感的场景,确保任务能及时执行。
  • 在实际应用中,应根据业务需求和系统架构来选择最合适的拒绝策略,确保线程池的高效运行和系统的稳定性。

    转载地址:http://ymhs.baihongyu.com/

    你可能感兴趣的文章
    python | Python反向迭代:reversed实现机制
    查看>>
    python | Python开发必知的数据容器用法(建议收藏!)
    查看>>
    python读取文件夹下文件名称_如何在Python目录中获取文件名列表
    查看>>
    python | Python文本处理中的相似性识别应用
    查看>>
    python | Python模块缓存:sys.modules机制
    查看>>
    python | Python集成学习和随机森林算法
    查看>>
    python | Python高阶函数与函数式编程
    查看>>
    python | pytime,一个实用的 时间和日期处理 Python 库!
    查看>>
    python | pyupgrade,一个有趣的 Python 库!
    查看>>
    python | pyvips,一个神奇的 图像处理 Python 库
    查看>>
    Python | qutip,一个高级的 Python 库!
    查看>>
    python | rapidjson,一个实用的 提高JSON处理效率 Python 库!
    查看>>
    python | reflex,一个无敌的 Python 库!
    查看>>
    python | reloading,一个强大的 Python 库!
    查看>>
    python | rich,一个无敌的 Python 库!
    查看>>
    python | rlax,一个超强的 强化学习领域 Python 库!
    查看>>
    python | rpyc,一个超实用的 Python 库!
    查看>>
    python | rq,一个无敌的 关于Redis 的Python 库!
    查看>>
    python读取字符串指定位置字符_python要怎么截取指定位置的字符串呢?
    查看>>
    python | scikit-llm,一个神奇的 Python 库!
    查看>>