目录
线程池的执行流程:
为什么核心线程池满了后 不直接创建新的线程去执行新任务?
而是先交给任务队列呢?
《并发编程的艺术》中的解答是:
ThreadPoolExecutor
采取上述步
骤
的
总
体
设计
思路,是
为
了在
执
行
execute()
方法
时
,
尽可能
采取上述步
骤
的
总
体
设计
思路,是
为
了在
执
行
execute()
方法
时
,
尽可能
地避免获取全局锁
(那将会是一个
严
重的可伸
缩
瓶
颈
)。在
ThreadPoolExecutor
完成
预热
之后
(那将会是一个
严
重的可伸
缩
瓶
颈
)。在
ThreadPoolExecutor
完成
预热
之后
(当前运行的
线
程数大于等于
corePoolSize
),几乎所有的
execute()
方法
调
用都是
执
行步
骤
2
也就是放入队列,而步
骤
2
不需要
获
取全局
锁。
线
程数大于等于
corePoolSize
),几乎所有的
execute()
方法
调
用都是
执
行步
骤
2
也就是放入队列,而步
骤
2
不需要
获
取全局
锁。
因为如果核心线程满了就创建新的线程去执行,达到最大线程数之后再放入队列,那么新创建线程就需要获取全局锁,对性能有很大的损耗。
而且如果正在被核心线程执行的任务很快的执行完,就可以直接从任务队列中取出新的任务执行。
这样不需要创建新的线程也可以完成任务,那么这样还可以节省一部分内存。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/92811.html