ThreadPoolExecutor的四种抛弃策略

本文详细介绍了ThreadPoolExecutor在任务过多时采用的四种抛弃策略,包括默认的AbortPolicy策略。内容基于Java 1.8,探讨了不同策略对系统性能和异常处理的影响。

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

常规情况下:

 ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 3, 1, TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(5), new ThreadPoolExecutor.AbortPolicy());
        //任务8,9没执行,不继续执行,抛出异常
/*        Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@4b6995df rejected from java.util.concurrent.ThreadPoolExecutor@61443d8f[Running, pool size = 3, active threads = 3, queued tasks = 5, completed tasks = 0]
        at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
     
### Java 线程池的四种拒绝策略 #### AbortPolicy(默认策略) 当线程池无法处理新的任务时,`AbortPolicy`会通过抛出`RejectedExecutionException`异常来通知调用方。这种方式适合于那些不允许任务丢失的应用程序环境,比如实时数据处理系统,在这种情况下如果一个任务被拒绝,则意味着出现了严重错误[^1]。 ```java ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); ``` #### CallerRunsPolicy 此政策下,当线程池满载时,不是由线程池中的工作线程而是由提交该任务的主线程本身去执行这个任务。这有助于减慢新任务的到来速度从而缓解系统的压力。它特别适用于负载相对较小的情况,能够防止过多的新请求进入而造成资源耗尽的同时也确保了不会有任何任务因为溢出而被抛弃[^2]。 ```java ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); ``` #### DiscardPolicy 对于不需要严格保证所有任务都能被执行的情形,可以选择使用`DiscardPolicy`。一旦遇到超出承载能力的任务,就简单地将其丢弃而不做任何其他操作或提示。这类做法常见于某些特定类型的后台服务中,例如缓存刷新机制里,其中偶尔几次的数据同步失败并不会影响整体功能正常运作。 ```java ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); ``` #### DiscardOldestPolicy 最后一种是`DiscardOldestPolicy`,它的行为模式是从等待队列头部移除最老的一个未处理任务以便腾出空间给当前最新的待加入任务。这样的设计思路非常适合那种只关心最近发生的事件记录或者状态更新的服务端应用场合,如短时间内频繁产生的日志条目收集等场景。 ```java ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十六画生的博客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值