在使用parallelStream时,在JDK8中会生成多少线程?例如,对于以下代码:
list.parallelStream().forEach(/** Do Something */);
如果这个列表有100000个项目,会生成多少个线程?
此外,每个线程是否获得相同数量的项目来处理,还是随机分配的?
list.parallelStream().forEach(/** Do Something */);
如果这个列表有100000个项目,会生成多少个线程?
此外,每个线程是否获得相同数量的项目来处理,还是随机分配的?
Oracle的并行流实现[1]使用当前线程,如果需要,还会使用组成默认ForkJoinPool ForkJoinPool.commonPool()
的线程,该池的默认大小等于CPU核心数减一。
可以使用以下属性更改公共池的默认大小:
-Djava.util.concurrent.ForkJoinPool.common.parallelism=8
或者,您可以使用自己的池:
ForkJoinPool myPool = new ForkJoinPool(8);
myPool.submit(() ->
list.parallelStream().forEach(/* Do Something */);
).get();
ForkJoinPool
来内部渲染基于ForkJoinTask.fork
行为的替代方案完全无用(在此处查看详情)。Stream
APIs use of ForkJoinPool
is an implementation detail. Thus, both solutions work with Oracle’s current implementation but are not guaranteed to work everywhere.翻译后:需要注意的是,Stream
API 使用 ForkJoinPool
是一项实现细节。因此,这两种解决方案适用于 Oracle 的当前实现,但不能保证在所有情况下都能奏效。 - HolgerparallelStream(int maxDegreeOfParallelism)
--你知道,就像我们在C#中所拥有的那样。 - Josh M.