线程池常用的阻塞队列

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

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

● 容量为 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,所以最多只能创建核心线程数的线程。

相关推荐
辣机小司5 分钟前
【软件设计师】自编思维导图和学习资料分享(中级已过)
java·c++·软考·软件设计师
董世昌418 分钟前
什么是扩展运算符?有什么使用场景?
开发语言·前端·javascript
lsx2024068 分钟前
C++ 重载运算符和重载函数
开发语言
爱笑的眼睛1130 分钟前
深入解析Matplotlib Axes API:构建复杂可视化架构的核心
java·人工智能·python·ai
刺客xs41 分钟前
Qt------信号槽,属性,对象树
开发语言·qt·命令模式
2501_9216494943 分钟前
免费获取股票历史行情与分时K线数据 API
开发语言·后端·python·金融·数据分析
乐观甜甜圈44 分钟前
JDK8 中线程实现方法与底层逻辑详解
java
尤物程序猿1 小时前
Java如何不建表完成各种复杂的映射关系(鉴权概念、区域概念、通用概念)
java·开发语言
cike_y1 小时前
JSP内置对象及作用域&双亲委派机制
java·前端·网络安全·jsp·安全开发
也许是_1 小时前
大模型应用技术之 Spring AI 2.0 变更说明
java·人工智能·spring