JDK内置线程池拒绝策略

jdk1.5以后新增了java.util.concurrent包下的api,简化了多线程代码的开发,底层的实现都是ThreadPoolExecutor,在ThreadPoolExecutor的源码中我们可以看到四种种实现策略:

  • CallerRunsPolicy:只要线程池没有关闭,就在调用者的线程中执行任务。一般在不允许失败、对性能要求不高、并发小的场景使用。
    public static class CallerRunsPolicy implements RejectedExecutionHandler {
            
            public CallerRunsPolicy() { }
    
            public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
                if (!e.isShutdown()) {
                    r.run();
                }
            }
        }

  • AbortPolicy:直接抛异常,默认是这种策略。需要处理好异常,因为他会打断当前的执行流程。
    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());
            }
        }

  • DiscardPolicy:什么也不做,直接丢弃。
    public static class DiscardPolicy implements RejectedExecutionHandler {
            
            public DiscardPolicy() { }
    
            public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            }
        }

  • 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);
                }
            }
        }

    以上是jdk的内置策略,在实际开发中可以根据自己业务需求,实现RejectedExecutionHandler自定义自己需要的策略,有很多第三方的拒绝策略,比如dubbo、netty、activemq中的线程池拒绝策略都是不错的,感兴趣的同学可以看下源码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值