Sin*_*nky 59 java multithreading java.util.concurrent java-8
在JDK8中,当我使用parallelStream时会产生多少个线程?例如,在代码中:
list.parallelStream().forEach(/** Do Something */);
Run Code Online (Sandbox Code Playgroud)
如果此列表包含100000个项目,将生成多少个线程?
另外,每个线程都可以获得相同数量的项目,还是随机分配?
Umb*_*ndi 63
Oracle的并行流实现[1]使用当前线程,除此之外,如果需要,还使用组成默认fork连接池的线程,ForkJoinPool.commonPool()
默认大小等于比CPU核心数小1的默认大小. .
可以使用以下属性更改公共池的默认大小:
-Djava.util.concurrent.ForkJoinPool.common.parallelism=8
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用自己的游泳池:
ForkJoinPool myPool = new ForkJoinPool(8);
myPool.submit(() ->
list.parallelStream().forEach(/* Do Something */);
).get();
Run Code Online (Sandbox Code Playgroud)
关于订单,只要线程可用,就会立即执行作业,而不是特定的顺序.
正如@Holger正确指出的那样,这是一个特定于实现的细节(文档底部只有一个模糊的引用),这两种方法都适用于Oracle的JVM,但绝对不能保证可以在其他供应商的JVM上运行,属性可以在非Oracle实现中不存在,并且Streams甚至无法使用ForkJoinPool
内部呈现基于ForkJoinTask.fork
完全无用行为的替代方法(有关详细信息,请参阅此处).