记一次线程池的maximumPoolSize的误用

jdk的线程池

原来的代码:

ThreadPoolExecutor aliGetTaskThreadPool = new ThreadPoolExecutor(4, 8, 0L,
        TimeUnit.MILLISECONDS,
        new LinkedBlockingQueue<>(),
        new ThreadFactoryBuilder().setNameFormat("VideoConvertDispatcher-aliGetTaskThreadPool-%d")
            .build());

因为设置了线程池的maximumPoolSize为8,我以为提交任务比较多时,会生成8个线程,结果在测试中发现始终都只有4个线程在跑。后来发现是我理解错了(以前背的八卦文忘了好多了-_-)。正确答案应该是当线程数大于corePoolSize数量,并且等待队列已满,但是还没有达到最大线程数maximumPoolSize,则线程池才会创建新的“非核心线程”来执行任务。在这里因为等待队列无界,所以自然线程数不会超过corePoolSize 4. 于是我又做了个验证实验,把LinkedBlockingQueue改为了SynchronousQueue,果然此时线程数能达到8个了。

简单来说,就是先maximumPoolSize再等待队列的理解是错误的。应该是先存等待队列,等待队列满了才会生成新线程,直到线程数量超过maximumPoolSize则执行拒绝策略。

参考:

If there are more than corePoolSize but less than maximumPoolSize threads running, a new thread will be created only if the queue is full.

tomcat等的线程池

1Tomcat 的线程池。。。只是对 jdk 线程池做了简单优化。。。当线程池没有达到最大执行线程的时候,会优先开线程再使用任务队列

2tomcat线程池策略和Dubbo的饥饿线程池逻辑差不多,只是实现不同。因为应用服务器或者RPC注重响应时间和资源占用,资源占用越少越好,响应时间越短越好,吞吐量越大越好。而jdk线程池,在核心线程用完后,就只能通过添加阻塞队列,而tomcat和dubbo为了保证响应速度,工作线程数只要不大于最大线程数,优先创建线程,创建不了了才会添加到阻塞对列中。


  1. Tomcat 线程池 ↩︎

  2. 聊一下不同应用线程池策略(jdk,tomcat,dubbo) ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_23204557

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值