java线程池拒绝策略

在这里插入图片描述
我们先一起来看下juc包下的线程池的核心构造方法。

corePoolSize:线程池核心线程大小
maximumPoolSize:线程池最大线程数量
keepAliveTime:非核心线程最大空闲时间,空闲时间达到这个数值,线程会被销毁
unit:空闲时间单位
worrkQueue:线程池的等待队列
threadFactory:创建线程的工厂 handler:拒绝策略

Executors工具类静态方法创建的各类线程池,其实最后都是调用的这个构造函数。

今天我们主要介绍的时最后一个参数,handler(拒绝策略)。讲拒绝策略之前先要讲一下线程池的运行机制。(没有找到很好画图工具,大家将就看下)
在这里插入图片描述

默认的拒绝策略,大家可以点开ThreadPoolExecutor类看下源码,我们可以看到默认的线程池拒绝策略。

   /**
     * The default rejected execution handler
     */
private static final RejectedExecutionHandler defaultHandler =
new AbortPolicy();

下面介绍下几种策略(都是实现了RejectedExecutionHandler接口)
AbortPolicy终止策略(默认): 默认,队列满了丢弃任务抛出异常
DiscardPolicy抛弃策略: 队列满了丢弃任务不异常
DiscardOldestPolicy抛弃旧任务策略: 将最早进入队列的任务删,之后再尝试加入队列
CallerRunsPolicy调用者运行的策略: 如果添加到线程池失败,那么主线程会自己去执行该任务(这个时候会严重影响程序效率)

了解几种拒绝策略后大家可以根据自己实际业务场景选择合适拒绝策略。

补充:

tomcat的线程池和jdk的线程池的运行机制有些不同。在核心线程池满了后,jdk线程池,选择将任务添加到任务队列;而tomcat线程池则是开始按照最大线程池的定义,开始创建线程,待达到最大线程池数量后,才将任务添加到任务队列。
设计区别的原因是,jdk线程池设计考虑的是计算密集型,那么线程达到核心线程池数量,认为cpu已经很繁忙了;而tomcat则是IO密集型的,所以在达到核心线程数量时候,cpu还很空闲,应该先创建线程。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值