线程池常用的阻塞队列

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

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

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

相关推荐
学Linux的语莫18 小时前
python项目打包为镜像
java·python·spring
Ashley_Amanda18 小时前
Python 进阶:从熟练到精通的核心技能体系
开发语言·python
你怎么知道我是队长19 小时前
C语言---命令行参数
c语言·开发语言
秋刀鱼程序编程19 小时前
Java编程基础入门(四)---选择循环语句
java·开发语言·算法
一条咸鱼_SaltyFish19 小时前
WebFlux vs MVC:Gateway集成若依框架的技术选型之争
java·开发语言·微服务·gateway·mvc·开源软件·webflux
独自归家的兔19 小时前
Java反射之根:Class类生成机制深度剖析与最佳实践
java·开发语言
请叫我聪明鸭19 小时前
基于 marked.js 的扩展机制,创建一个自定义的块级容器扩展,让内容渲染为<div>标签而非默认的<p>标签
开发语言·前端·javascript·vue.js·ecmascript·marked·marked.js插件
悟能不能悟19 小时前
Gson bean getxxx,怎么才能返回给前端
java·前端
Apex Predator19 小时前
本地库导入到nexus
java·服务器·前端
仍然.19 小时前
Java---反射、枚举、lambda表达式 和 泛型进阶
java·开发语言