线程池常用的阻塞队列

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

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

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

相关推荐
Leo655351 天前
easyExcel 的动态列导出把文本转为数值格式,可以进行函数计算
java
v_for_van1 天前
单片机内存分配管理笔记
开发语言·c++·笔记·vscode·stm32·单片机·嵌入式硬件
鹿角片ljp1 天前
力扣136.只出现一次的数字-异或和HashMap
java·数据结构·算法·leetcode
W_a_i_T1 天前
【Coding日记】菜鸟编程C语言100例——第三题⚠️
c语言·开发语言·经验分享·算法·菜鸟编程
weixin_452159551 天前
多协议网络库设计
开发语言·c++·算法
十五年专注C++开发1 天前
浅谈C++插件机制的设计要点以及实现方案
开发语言·c++·系统架构·插件机制
Hello World . .1 天前
C语言printf: VT100 终端控制码
c语言·开发语言·jvm
爱装代码的小瓶子1 天前
【C++与Linux基础】文件篇 -语言特性上的文件操作
linux·开发语言·c++
weixin_395448911 天前
下位机&yolov11输出
java·服务器·前端
C+-C资深大佬1 天前
C++优化
开发语言·c++