线程池常用的阻塞队列

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

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

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

相关推荐
希望永不加班2 分钟前
SpringBoot 多模块项目搭建:service/dao/web分层设计
java·前端·spring boot·后端·spring
星晨雪海4 分钟前
springboot 增删改查全套流程
java·spring boot·spring
Devin~Y4 分钟前
高并发内容社区实战面试:从 Java 基础到 Spring Cloud、Kafka、Redis、RAG 搜索全解析
java·spring boot·redis·spring cloud·kafka·向量数据库·rag
Dream of maid7 分钟前
Python-基础1(数据类型)
开发语言·python
C雨后彩虹7 分钟前
箱子之字形摆放
java·数据结构·算法·华为·面试
lzhdim7 分钟前
C#中加载图片的资源释放
开发语言·c#
cch891812 分钟前
ThinkPHP3.x核心特性全解析
开发语言·后端·golang
℡終嚸♂68014 分钟前
PHP 反序列化漏洞详解
开发语言·php
star-yp14 分钟前
vibe coding 博客管理系统
java·spring boot·spring·ai·ai编程
小江的记录本16 分钟前
【JEECG Boot】JEECG Boot 系统性知识体系全方位结构化总结
java·前端·spring boot·后端·python·spring·spring cloud