规范是否保证所有对顺序Java流的操作都在当前线程中执行?(除了“forEach”和“forEachOrdered”)
我明确要求规范,而不是当前实现的情况。我可以自己查看当前实现,不需要麻烦您。但是实现可能会改变,并且还有其他实现。
我之所以问这个问题,是因为ThreadLocals:我使用一个内部使用ThreadLocals的框架。即使像company.getName()这样的简单调用最终也会使用ThreadLocal。我无法更改该框架的设计。至少不能在合理的时间内。
规范在这里似乎令人困惑。 "java.util.stream"包 的文档说明:
如果行为参数具有副作用,则除非明确说明,否则不能保证这些副作用对其他线程可见,也不能保证在同一流管道中的“相同”元素上执行的不同操作在同一线程中执行。
即使将流水线限制为生成与流源的遇到顺序一致的结果(例如,IntStream.range(0,5).parallel().map(x -> x*2).toArray()必须生成[0, 2, 4, 6, 8]),也不会做出任何保证,即映射器函数应用于单个元素的顺序或在哪个线程中执行任何行为参数。
我理解为: 每个流上的每个操作都可以在不同的线程中执行。但是“forEach”和“forEachOrdered”的文档明确说明:
我已经搜索了关于“Java”、“Stream”和“ThreadLocal”组合的官方答案,但没有找到任何信息。最接近的是Brian Goetz在这里Stack Overflow上回答相关问题的答案,但它是关于顺序而不是线程的,并且仅涉及“forEach”,而不涉及其他流方法:Stream.forEach是否尊重顺序?
我明确要求规范,而不是当前实现的情况。我可以自己查看当前实现,不需要麻烦您。但是实现可能会改变,并且还有其他实现。
我之所以问这个问题,是因为ThreadLocals:我使用一个内部使用ThreadLocals的框架。即使像company.getName()这样的简单调用最终也会使用ThreadLocal。我无法更改该框架的设计。至少不能在合理的时间内。
规范在这里似乎令人困惑。 "java.util.stream"包 的文档说明:
如果行为参数具有副作用,则除非明确说明,否则不能保证这些副作用对其他线程可见,也不能保证在同一流管道中的“相同”元素上执行的不同操作在同一线程中执行。
即使将流水线限制为生成与流源的遇到顺序一致的结果(例如,IntStream.range(0,5).parallel().map(x -> x*2).toArray()必须生成[0, 2, 4, 6, 8]),也不会做出任何保证,即映射器函数应用于单个元素的顺序或在哪个线程中执行任何行为参数。
我理解为: 每个流上的每个操作都可以在不同的线程中执行。但是“forEach”和“forEachOrdered”的文档明确说明:
如果每个流操作可以在未指定的线程中发生,则该语句将是冗余的。因此,相反的情况是否正确:所有串行流上的操作都保证在当前线程中执行,除了“forEach”和“forEachOrdered”?针对任何给定元素,动作可能会在库选择的任何时间和任何线程中执行。
我已经搜索了关于“Java”、“Stream”和“ThreadLocal”组合的官方答案,但没有找到任何信息。最接近的是Brian Goetz在这里Stack Overflow上回答相关问题的答案,但它是关于顺序而不是线程的,并且仅涉及“forEach”,而不涉及其他流方法:Stream.forEach是否尊重顺序?
forEach
文档在开头就指出:“对于并行流管道...”,这仅涉及并行处理;即使有两个句子。 - Eugene