Java线程池拒绝策略详解(4种常见拒绝策略)

Java线程池拒绝策略详解(4种常见拒绝策略)-mikechen

Java线程池拒绝策略经常在Java面试被问到,具体有哪些策略?作用等,下面我详解线程池拒绝策略@mikechen

线程池拒绝策略作用

当线程池的线程数达到最大线程数时,需要执行拒绝策略,是在线程池无法接受新的任务时所采取的处理方式,这就是线程池的拒绝策略。

 

线程池拒绝策略种类

常见的拒绝策略有以下4种,如下图所示:

Java线程池拒绝策略详解(4种常见拒绝策略)-mikechen

1.AbortPolicy

默认的拒绝策略,当线程池已满时,直接抛出RejectedExecutionException异常,阻止系统继续执行。

public static class AbortPolicy implements RejectedExecutionHandler {
    public AbortPolicy() { }
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        throw new RejectedExecutionException("Task " + r.toString() +
                                             " rejected from " +
                                             e.toString());
    }
}

很简单粗暴,直接抛出个RejectedExecutionException异常,也不执行这个任务了。

 

2.CallerRunsPolicy

CallerRunsPolicy在任务被拒绝添加后,会用调用execute函数的上层线程去执行被拒绝的任务。

public static class CallerRunsPolicy implements RejectedExecutionHandler {
    public CallerRunsPolicy() { }
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        if (!e.isShutdown()) {
            r.run();
        }
    }
}

在调用execute方法的线程中直接运行被拒绝的任务,可以减缓新任务的流量。

 

3.DiscardOldestPolicy

抛弃任务队列中等待时间最长的任务,并尝试重新提交当前被拒绝的任务。

public static class DiscardOldestPolicy implements RejectedExecutionHandler {
    public DiscardOldestPolicy() { }
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        if (!e.isShutdown()) {
            e.getQueue().poll();
            e.execute(r);
        }
    }
}

DiscardOldestPolicy策略的作用是,当任务呗拒绝添加时,会抛弃任务队列中最旧的任务也就是最先加入队列的,再把这个新任务添加进去。

 

4.DiscardPolicy

直接抛弃被拒绝的任务,不做任何处理。

public static class DiscardPolicy implements RejectedExecutionHandler {
    public DiscardPolicy() { }
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
    }
}

采用这个拒绝策略,会让被线程池拒绝的任务直接抛弃,不会抛弃也不会执行。

除了以上四种常见的Java线程池拒绝策略,更多线程池内容,请查看:线程池超详解(原理流程参数及创建使用)

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法