首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java 8的“流”可以在没有你要求的情况下并行吗?

Java 8的“流”可以在没有你要求的情况下并行吗?
EN

Stack Overflow用户
提问于 2015-01-14 09:47:25
回答 2查看 2.2K关注 0票数 20

在我看来,在使用Java8Stream时,无论是“对象”流还是原始流(即IntStream和朋友),最明显的代码都是使用:

代码语言:javascript
复制
someStreamableResource.stream().whatever()

但是,相当多的“流媒体资源”也有.parallelStream()

在读取javadoc时,不清楚的是.stream()流是否总是顺序的,以及.parallelStream()流是否总是并行的……

然后是Spliterator,特别是它的.characteristics(),其中之一是它可以是CONCURRENT,甚至是IMMUTABLE

我的直觉是,事实上,默认情况下,Stream是否可以并行,或者根本就是并行,都是由它的底层Spliterator决定的……

我在正确的轨道上吗?我已经读了一遍又一遍javadoc,但仍然不能给这个问题一个明确的答案……

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-15 03:06:47

首先,通过镜头的规范。流是并行的还是顺序的是流状态的一部分。流创建方法应该指定它们是创建顺序流还是并行流( JDK中的大多数都是这样做的),但并不要求它们这样做。如果您的流来源没有说明,请不要假设。如果有人给你传了一条流,不要假设。

并行流可以根据自己的判断退回到顺序实现(因为顺序实现是并行实现,只是潜在的不完美实现);相反的情况并非如此。

现在,通过实现的镜头。在Collections和其他JDK类中的流创建方法中,我们坚持“创建顺序流,除非用户显式要求并行性”的原则。(然而,其他库做出了不同的选择。如果他们有礼貌,他们会明确自己的行为。)

流并行和Spliterator之间的关系只有一个方向。Spliterator可以拒绝拆分--有效地拒绝任何并行性--但它不能要求客户端拆分它。因此,一个不合作的拆分器可以破坏并行性,但不能确定它。

票数 15
EN

Stack Overflow用户

发布于 2015-01-14 10:28:20

这里提到了here:“当你创建一个流时,除非另有说明,否则它总是一个串行流。”和here:“允许此方法(parallelStream)返回顺序流。”

CONCURRENTIMMUTABLE (直接)与此无关。它们分别指定是否可以在不使拆分器无效的情况下修改基础集合,或者是否不可变。trySplit是拆分器的一个特性,它在很大程度上定义了parallelStream的行为。并行数据流上的终端操作最终将调用trySplit,无论该实现做什么,最终都将定义并行处理数据的哪些部分(如果有的话)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27934587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档