线程池4种拒绝策略

线程池在关闭或工作饱和时会拒绝新任务。AbortPolicy策略抛出异常,DiscardPolicy丢弃任务不通知,DiscardOldestPolicy丢弃最旧任务,CallerRunsPolicy由提交者执行任务。理解并选择合适的拒绝策略对处理任务提交至关重要。
摘要由CSDN通过智能技术生成

拒绝时机

首先,新建线程池时可以指定它的任务拒绝策略,例如:

newThreadPoolExecutor(
5,
10,
5,
TimeUnit.SECONDS, new LinkedBlockingQueue<>(),
new ThreadPoolExecutor.DiscardOldestPolicy()
);

以便在必要的时候按照我们的策略来拒绝任务,那么拒绝任务的时机是什么呢?线程池会在以下两种情况下会拒绝新提交的任务。

第一种情况是当我们调用 shutdown 等方法关闭线程池后,即便 此时可能线程池内部依然有没执行完的任务正在执行,
但是由于线程池已经关闭,此时如果再向线程池内提交任务,就会遭到拒绝。
(线程池已关闭,此时可能线程池内部依然有没执行完的任务正在执行,此时如果再向线程池内提交任务,就会遭到拒绝.)

第二种情况是线程池没有能力继续处理新提交的任务,也就是工作已经非常饱和的时候。
具体讲一下第2种情况,也就是由于工作饱和导致的拒绝。
(由于线程池工作饱和,线程池没有能力继续处理新提交的任务,导致线程池的拒绝。)

比如:新建一个线程池,

使用容量上限为 10 的 ArrayBlockingQueue 作为任务队列,并且指定线程池的核心线程数为 5,最大线程数为 10,

假设此时有 20 个耗时任务被提交,在这种情况下,线程池会首先创建核心数量的线程,

也就是5个线程来执行任务,然后往队列里去放任务,

队列的 10 个容量被放满了之后,会继续创建新线程,直到达到最大线程数 10。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值