ThreadPoolExecutor有哪些拒绝策略

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

在Java的java.util.concurrent包中,ThreadPoolExecutor类用于创建和管理线程池。当线程池无法接受新任务时,它会采用所谓的拒绝策略(RejectedExecutionHandler)。以下是ThreadPoolExecutor提供的四种标准拒绝策略:

1. AbortPolicy

默认的拒绝策略。当任务被拒绝时,AbortPolicy策略会抛出一个RejectedExecutionException异常。

RejectedExecutionHandler abortPolicyHandler = new ThreadPoolExecutor.AbortPolicy();

2. CallerRunsPolicy

这种策略不会抛出异常,而是将任务回退给调用者线程来直接运行。如果执行器已关闭,则会丢弃任务。

RejectedExecutionHandler callerRunsPolicyHandler = new ThreadPoolExecutor.CallerRunsPolicy();

3. DiscardPolicy

这种策略将静默地丢弃被拒绝的任务,不做任何处理也不抛出异常。如果任务无法执行,这种策略默认会放弃执行。

RejectedExecutionHandler discardPolicyHandler = new ThreadPoolExecutor.DiscardPolicy();

4. DiscardOldestPolicy

这种策略将丢弃最早的未处理的任务请求,然后尝试重新提交新的任务。如果执行器已关闭,则会丢弃任务。

RejectedExecutionHandler discardOldestPolicyHandler = new ThreadPoolExecutor.DiscardOldestPolicy();

自定义拒绝策略

除了上述标准策略,你还可以实现RejectedExecutionHandler接口来定义自己的拒绝策略。

public class MyRejectedExecutionHandler implements RejectedExecutionHandler {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        // 自定义处理逻辑
    }
}

在创建ThreadPoolExecutor时,可以通过构造函数传入你选择的拒绝策略:

int corePoolSize = 10;
int maximumPoolSize = 20;
long keepAliveTime = 60;
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); // 可以选择上述任何一个策略

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    corePoolSize,
    maximumPoolSize,
    keepAliveTime,
    unit,
    workQueue,
    handler
);

正确选择和实现拒绝策略对于构建健壮的并发应用程序至关重要,它可以帮助你合理地处理多余的任务,并确保系统在高负载下的稳定性。

最后更新于