线程池常用的阻塞队列

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

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

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

相关推荐
步行cgn2 分钟前
Spring 基于 XML 的自动装配:byType 详解
java·后端·spring
边境悍匪6 分钟前
蜗牛学苑 Java 智能体学习 Day46|贯穿项目 2 思维导图复盘
java·开发语言·vue.js·学习·spring
智慧物业老杨2 小时前
物业日常巡查的数智化重构:从“打卡式巡检“到“闭环式风控“
android·java·人工智能·系统架构·rxjava
晴天的雨.9923 小时前
【C++算法】和为s的两个数
开发语言·数据结构·c++·算法
IvanCodes8 小时前
Python 数据处理(十三):JSON、CSV 与数据序列化
开发语言·python
步行cgn9 小时前
Spring c 命名空间注入详解
java·后端·spring
明月_清风9 小时前
Maven 到底是什么?一篇文章搞懂 Java 项目构建与依赖管理
java·后端·maven
aramae9 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
Rain的Java大神之路10 小时前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
Wang's Blog11 小时前
Java 接入Redis: 通用命令与键管理
java·服务器·redis