线程池常用的阻塞队列

新任务来的时候,会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。

不同的线程池会选用不同的阻塞队列,我们可以结合内置线程池来分析。

● 容量为 Integer.MAX_VALUE 的 LinkedBlockingQueue (无界队列):FixedThreadPool和 SingleThreadExector。FixedThreadPool 最多只能创建核心线程数的线程(核心线程数和最大线程数相等),SingleThreadExector 只能创建一个线程(核心线程数和最大线程数都是 1),二者的任务队列永远不会被放满。

● SynchronousQueue(同步队列):CachedThreadPool。SynchronousQueue 没有容量,不存储元素,目的是保证对于提交的任务,如果有空闲线程,则使用空闲线程来处理;否则新建一个线程来处理任务。也就是说,CachedThreadPool 的最大线程数是Integer.MAX_VALUE,可以理解为线程数是可以无限扩展的,可能会创建大量线程,从而导致 OOM。

● DelayedWorkQueue(延迟阻塞队列):ScheduledThreadPool 和SingleThreadScheduledExecutor。DelayedWorkQueue 的内部元素并不是按照放入的时间排序,而是会按照延迟的时间长短对任务进行排序,内部采用的是"堆"的数据结构,可以保证每次出队的任务都是当前队列中执行时间最靠前的。DelayedWorkQueue添加元素满了之后会自动扩容原来容量的 1/2,即永远不会阻塞,最大扩容可达Integer.MAX_VALUE,所以最多只能创建核心线程数的线程。

相关推荐
geovindu6 小时前
rust:N-Barrier Pattern
开发语言·后端·设计模式·rust·屏障模式·并发型模式
AI宇宙狂想家6 小时前
开源 AI 视频工具进化史:从难用到好用,OpenMontage 改了什么
开发语言·前端·人工智能·开源·ai创业·openmontage
代码什么用6 小时前
Maven&Nexus
java·maven
顧棟6 小时前
OpenAPI 网关:鉴权 + 流量治理 一体化设计方案与实现
java·spring boot·设计模式
Rain的Java大神之路6 小时前
「设计一个在线文档协同编辑系统」:从 WebSocket、OT/CRDT 到快照回放,一篇讲透这道面试顶流题
java·后端·面试
大鹏说大话6 小时前
和小鹅通相近的知识付费小程序平台有哪些
开发语言
程序员梅雨6 小时前
【从零开始学习数据仓库 | 第三篇】: Flume——数据采集基石
java·大数据·数据仓库·后端·学习·flume
Dovis(誓平步青云)6 小时前
启元 T1 Pro 视觉伺服实践:基于 HSV 阈值与针孔测距的启元机器人寻物实现
开发语言·人工智能·机器学习·二次开发
acd120096 小时前
域名解析缓存带来的隐性故障,很多排查都漏掉了这一层
java·运维·nginx