java线程池大小为何会大多被设置成CPU核心数+1?

发布于 2022-09-01 22:02:09 字数 106 浏览 5 评论 0

线程池大小设置成与CPU核心数相等我是可以理解的,但是为什么有的默认线程池大小是CPU核心数+1(参考android的AsyncTask的实现)。
既然可以是+1,那+2,+3又有多大的影响呢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

幸福丶如此 2022-09-08 22:02:09

假设你的任务非常消耗CPU, 那么现在每个CPU都被占满了, 你再增加线程个数, 只能降低系统的效率, 因为线程还需要切换;
假如你的任务不是那么消耗CPU, 那么现在可能每个CPU都有空闲, 你增加线程个数, 也没有什么卵用.

所以, 最佳线程个数一般在N和N+1之间选择.

淤浪 2022-09-08 22:02:09

线程数一个计算公式,
线程数=CPU核心数/(1-阻塞系数)
看你的任务是计算密集性的还是IO密集性的
IO密集型的,阻塞系数加大,计算密集型的阻塞系数减少
阻塞系数可以将其理解为 阻塞时间/计算时间;

最理想的情况,每个CPU在计算过程中,没有任何的IO阻塞,那么线程数为CPU核心数
如果阻塞严重,意味为CPU核心等待的时间消耗会很长,此时CPU调度系统会将此CPU核心让渡出来,执行其他的计算任务,此时线程数就应该相应的增大
如果阻塞很小,CPU空闲时间很少,CPU将近100%的被利用,那么你设置再多的线程数也没用,线程池还是要等待

实际在CPU利用过程中,CPU不会把全部资源交给线程池处理任务,还需要处理其它计算任务~~~

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文