Java Fork/Join Pool线程数相关问询:依赖CPU及自定义设置问题
刚好对Fork/Join Pool这块比较熟,来给你解答这两个问题:
问题1:是否可以认为Fork/Join Pool中的线程数量完全取决于底层CPU的数量?
其实不能这么绝对。默认情况下,Fork/Join Pool会把Runtime.getRuntime().availableProcessors()的返回值作为初始并行度(也就是线程数的基准),但这只是默认的初始策略,不是刚性绑定。
池里的线程数量是会动态调整的:比如当很多线程因为调用join()等待子任务完成而阻塞时,池会临时创建更多线程来利用空闲的CPU资源,避免算力浪费;等任务负载降下来,这些额外创建的线程又会被自动回收。所以CPU数量是重要参考,但不是唯一决定线程数的因素。
问题2:开发者能否指定Fork/Join Pool创建特定数量的线程?若可以,是否能保证池会创建该数量的线程?
当然可以指定!你可以通过ForkJoinPool的构造函数直接设定并行度,比如用new ForkJoinPool(4)就能指定初始线程数为4。不过这个数值并不是绝对保证始终维持不变:
- 初始化阶段,池会严格按照你指定的数量创建线程;如果某个线程因为未捕获的异常意外退出,池会自动补充新线程,尽量维持你设定的数量。
- 和默认逻辑一样,如果有线程阻塞等待子任务,池还是会临时创建超出指定数量的线程来提升并行效率,这些临时线程在空闲一段时间后会被销毁,回到你指定的核心线程数。
- 另外,就算你指定的并行度超过CPU核心数,池也会按设定值初始化线程,但实际运行中因为CPU资源限制,这些线程不会同时处于运行状态,会有调度切换的情况。
内容的提问来源于stack exchange,提问作者Hitesh
相关产品推荐
相关产品推荐

