ThreadPoolExecutor 有哪些拒绝策略
ThreadPoolExecutor 有哪些拒绝策略
程序员朱永胜有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准
https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。https://store.amazingmemo.com/chapterDetail/1685324709017001`
在 Java 的 java.util.concurrent
包中,ThreadPoolExecutor
类用于创建和管理线程池。当线程池无法接受新任务时,它会采用所谓的拒绝策略(RejectedExecutionHandler)。以下是 ThreadPoolExecutor
提供的四种标准拒绝策略:
1. AbortPolicy
默认的拒绝策略。当任务被拒绝时,AbortPolicy
策略会抛出一个 RejectedExecutionException
异常。
1 | RejectedExecutionHandler abortPolicyHandler = new ThreadPoolExecutor.AbortPolicy(); |
2. CallerRunsPolicy
这种策略不会抛出异常,而是将任务回退给调用者线程来直接运行。如果执行器已关闭,则会丢弃任务。
1 | RejectedExecutionHandler callerRunsPolicyHandler = new ThreadPoolExecutor.CallerRunsPolicy(); |
3. DiscardPolicy
这种策略将静默地丢弃被拒绝的任务,不做任何处理也不抛出异常。如果任务无法执行,这种策略默认会放弃执行。
1 | RejectedExecutionHandler discardPolicyHandler = new ThreadPoolExecutor.DiscardPolicy(); |
4. DiscardOldestPolicy
这种策略将丢弃最早的未处理的任务请求,然后尝试重新提交新的任务。如果执行器已关闭,则会丢弃任务。
1 | RejectedExecutionHandler discardOldestPolicyHandler = new ThreadPoolExecutor.DiscardOldestPolicy(); |
自定义拒绝策略
除了上述标准策略,你还可以实现 RejectedExecutionHandler
接口来定义自己的拒绝策略。
1 | public class MyRejectedExecutionHandler implements RejectedExecutionHandler { |
在创建 ThreadPoolExecutor
时,可以通过构造函数传入你选择的拒绝策略:
1 | int corePoolSize = 10; |
正确选择和实现拒绝策略对于构建健壮的并发应用程序至关重要,它可以帮助你合理地处理多余的任务,并确保系统在高负载下的稳定性。