自定义线程池拒绝策略

本文探讨了Java中线程池的默认拒绝策略,并详细解释了如何自定义拒绝策略,使用LinkedBlockingQueue作为缓冲容器存储被拒绝的任务。通过模拟测试,展示了如何在单线程中定时取出任务并重新提交到线程池,以此避免丢弃任务或阻塞主线程。同时,文章提到了Producer-Consumer设计模式在解决多线程问题中的应用。
摘要由CSDN通过智能技术生成

一. 默认的拒绝策略
        ThreadPoolExceutor.AbortPolicy : 丢弃任务并抛出RejectedExecutionException异常。
        ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。         ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务

        ThreadPoolExecutor.CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务

        一般来说, 默认的这4种拒绝策略, 在一些场景是不适用的, 比如我们不想丢弃任何任务, 那么前3种拒绝策略就不适用了

         第4种拒绝策略比较特殊, 当执行该策略后, 会把当前线程交给 提交任务的线程 去执行这个任务, 比如说你是通过 主线程 开启的线程任务, 那么这个拒绝策略就是把 被线程池拒绝执行的任务, 反手交给 主线程执行, 并发量高的场景下, 会阻塞主线程, 所以也不是很适用, 下面使用伪代码自定义拒绝策略

二. 自定义拒绝策略
      如果不想丢弃该任务和不想交给主线程来执行该任务, 我们是不是可以把这些被拒绝执行的任务收集起来? 所以可以考虑使用缓存容器, 并且一定要是并发安全的缓存容器, 所以可以使用 juc 包下的 java.util.concurrent.LinkedBlockingQueue, 先介绍下这个类

        LinkedBlockingQueue是一个单向链表实现的阻塞队列, 该队列按 FIFO(先进先出)排序元素, 新元素插入到队列的尾部, 并且队列获取操作会获得位于队列头部的元素, 链接队列的吞吐量通常要高于基于数组的队列, 但是在大多数并发应用程序中, 其可预知的性能要低
        此外, LinkedBlockingQueue还是可选容量的(防止过度膨胀), 即可以指定队列的容量

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值