目录
线程池的执行流程:
为什么核心线程池满了后 不直接创建新的线程去执行新任务?
而是先交给任务队列呢?
《并发编程的艺术》中的解答是:
ThreadPoolExecutor
采取上述步
骤
的
总
体
设计
思路,是
为
了在
执
行
execute()
方法
时
,
尽可能
地避免获取全局锁
(那将会是一个
严
重的可伸
缩
瓶
颈
)。在
ThreadPoolExecutor
完成
预热
之后
(当前运行的
线
程数大于等于
corePoolSize
),几乎所有的
execute()
方法
调
用都是
执
行步
骤
2
也就是放入队列,而步
骤
2
不需要
获
取全局
锁。
因为如果核心线程满了就创建新的线程去执行,达到最大线程数之后再放入队列,那么新创建线程就需要获取全局锁,对性能有很大的损耗。
而且如果正在被核心线程执行的任务很快的执行完,就可以直接从任务队列中取出新的任务执行。
这样不需要创建新的线程也可以完成任务,那么这样还可以节省一部分内存。