前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Java面试小短文】当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?

【Java面试小短文】当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?

作者头像
砖业洋__
发布2023-05-06 20:43:30
3430
发布2023-05-06 20:43:30
举报
文章被收录于专栏:博客迁移同步博客迁移同步

当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?

当我们提交一个任务到线程池,它的工作原理如下:

  1. 预热核心线程

如果线程池的线程数小于corePoolSize(核心线程阈值),即使其他核心线程处于空闲状态,也会创建一个新核心线程来运行新任务。

  1. 把任务添加到阻塞队列

如果线程池的线程数大于等于corePoolSize但少于maxPoolSize(最大线程数阈值),则将任务放入阻塞队列。

  1. 如果添加阻塞队列失败,这时会创建一个非核心线程来增加处理效率

如果阻塞队列已满,并且线程池的线程数小于maxPoolSize,则创建一个新非核心线程来运行任务。

  1. 如果非核心线程数量达到阈值,就会触发一个拒绝策略

如果阻塞队列已满,并且线程数大于或等于maxPoolSize,则拒绝该任务。

所以如果我们希望这个任务不进入到阻塞队列,那么只需要处理第二步就好。

Java线程池里,它的构造方法里有一个参数可以去修改阻塞队列的类型

  其中有一个阻塞队列叫SynchronousQueue,这个队列是不能存储任何元素的阻塞队列,它的特性是每生产一个任务就必须指派一个消费者来处理这个任务,否则就会阻塞生产者。

  基于这个特性,我们只需要把线程池的阻塞队列替换成SynchronousQueue就好了,它就能够直接去避免任务进入到阻塞队列,而是直接去启动最大线程数量去处理任务。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档