线程池4种拒绝策略

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拒绝时机

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

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

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

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

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

比如:新建一个线程池,

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

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

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

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

此时线程池中一共有 20 个任务,其中 10 个任务正在被 10 个线程执行,还有 10 个任务在任务队列中等待,

而且由于线程池的最大线程数量就是 10,所以已经不能再增加更多的线程来帮忙处理任务了,

这就意味着此时线程池工作饱和,这个时候再提交新任务时就会被拒绝。

我们结合图示来分析上述情况,首先看右侧上方的队列部分,你可以看到目前队列已经满了,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值