按设置
corePoolSize
和
maximumPoolSize
同样,您可以创建
fixed-size thread pool
. 记录了对规则的非常好的解释
here
背景
maxPoolSize
隐式允许删除任务。
但是,默认队列容量为
Integer.MAX_VALUE
,实际上,它是无限的。
需要注意的是
ThreadPoolTaskExecutor
使用
ThreadPoolExecutor
下面介绍了一种有点不寻常的排队方法
the docs
:
如果
核心池大小
如果有一个或多个线程正在运行,执行器总是倾向于将请求排队,而不是添加新线程。
这意味着
最大池大小
仅当队列已满时才相关,否则线程数将永远不会超过
核心池大小
.
例如,如果我们提交任务
永远不会完成的
到线程池:
-
第一个
核心池大小
提交内容将分别启动一个新线程;
-
之后,所有提交都进入队列;
-
如果队列有限且其容量已耗尽,则每次提交都会启动一个新线程,最多
最大池大小
;
-
当池和队列都已满时,新提交将被拒绝。
排队
-阅读
docs
任何
BlockingQueue
可用于传输和保留提交的任务。此队列的使用与池大小交互:
-
如果运行的线程少于corePoolSize,则执行器始终
更喜欢添加新线程,而不是排队。
-
如果corePoolSize或更多线程正在运行,则执行器始终
宁愿对请求排队,也不愿添加新线程。
-
如果请求无法排队,则会创建一个新线程,除非
这将超过maximumPoolSize,在这种情况下,任务将
被拒绝。
Unbounded queues
. 使用无界队列(例如
LinkedBlockingQueue
没有预定义的容量)将导致
在所有corePoolSize线程都繁忙的情况下要排队的任务。
因此,不超过
核心池大小
将永远创建线程。(以及
的值
最大工具大小
因此没有任何影响。)
-
如果线程数小于
核心池大小
,新建
线程以运行新任务。
-
如果线程数等于(或大于)
核心池大小
,将任务放入队列。
-
如果队列已满,且线程数小于
最大池大小
,创建新线程以在其中运行任务。
-
如果队列已满,且线程数大于或
等于
最大池大小
,拒绝任务。