当前位置: 首页 > 知识库问答 >
问题:

在Java8中parallelStream中生成了多少线程?

公羊喜
2023-03-14

在JDK8中,当我使用ParallelStream时会生成多少线程?例如,在代码中:

list.parallelStream().forEach(/** Do Something */);

如果这个列表有100000个项目,那么会产生多少个线程?

另外,是每个线程都得到相同数量的项目来工作,还是随机分配?

共有1个答案

祁烨
2023-03-14

Oracle的并行流实现[1]使用当前线程,此外,如果需要,还使用组成默认fork连接池forkjoinpool.commonpool()的线程,该池的默认大小等于比CPU的内核数少一个。

可以使用以下属性更改公共池默认大小:

-Djava.util.concurrent.ForkJoinPool.common.parallelism=8

或者,您可以使用自己的池:

ForkJoinPool myPool = new ForkJoinPool(8);
myPool.submit(() ->
    list.parallelStream().forEach(/* Do Something */);
).get();

关于顺序,只要有一个线程可用,就会立即执行作业,没有特定的顺序。

正如@Holger所正确指出的,这是一个特定于实现的细节(在文档底部仅有一个模糊的引用),这两种方法都可以在Oracle的JVM上工作,但肯定不能保证在其他供应商的JVM上工作,该属性不可能存在于非Oracle实现中,流甚至不能在内部使用forkjoinpool使基于forkjoinask.fork行为的替代方案完全无用(请参阅此处了解有关此方面的详细信息)。

 类似资料:
  • 我有一个简单的应用程序,它将公开一个名为的RESTFul GETendpoint,它将简单地从DB中的device表返回所有设备的提取数据列表。 对于每个请求,我通过验证方法来验证用户身份。为了加速这个过程,我使用了parallelStream和lambda表达式。 在ParallelStream中,我调用了另一个名为的方法,在该方法中,我正在进行身份验证并从DB中提取数据。 问题是,当并行流进程

  • 我正在处理一批100个对象,将它们分成10个分区,每个分区都被发送到一个单独的线程进行并行处理。这是当前的代码: 我的理解是 如果我的理解有误,请纠正我,但这段代码仍按预期工作:并行化前75秒处理,并行化后20秒。看起来不错。 但过了一段时间,我注意到,根据Kibana的说法,这个过程实际上需要1ms或甚至零。这是因为新代码处理项目的速度非常快,以至于数据库没有时间处理100个项目,因此应该是10

  • 我想以秒为单位获取差异,以确定系统时区是在远程时区的前面还是后面。这里的远程时区值是从数据库中获取的“格林尼治标准时间”。它可能是“美国/东方”,我将其转换为“美国/New_York”。但是对于格林尼治标准时间,我得到了错误。 但它给出了以下错误, 如何解决此错误?用什么代替GMT??

  • 我正在处理一批100个对象,将它们分成10个分区,每个分区被发送到一个单独的线程进行并行处理。这是当前的代码: 我的理解是 如果我的理解有误,请纠正我,但无论如何,此代码仍按预期工作:并行化之前处理75秒,并行化后20秒。看起来不错。 但是过了一会儿,我注意到根据Kibana,这个过程现在实际上是或ven零。这是因为新代码处理项目的速度如此之快,以至于数据库没有时间达到100个要处理的项目,因此应

  • 我有一个UICollectionView,里面充满了图像、视频和声音字节。一切顺利!然而,我对带宽的使用感到关切。 我不确定使用出列可重用单元格的UICollectionView是如何工作的,也不确定这些项目何时从存储下载。 假设我有一个简单的牢房。 为了回答我的问题,假设我在集合视图单元格中有100个单元格,每次只显示3个单元格。 加载UICollectionView时是否加载所有100个图像?

  • 有一次,我被印上了“祝贺”,有一次,我被印上了“站台”。