该规范是否保证顺序 Java 流上的操作必须保留在当前线程中?
规范是否保证顺序 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”的文档明确指出:
对于任何给定的元素,可以在库选择的任何时间和任何线程中执行操作。
如果每个流操作都可以在未指定的线程中发生,则该语句将是多余的。因此,反之亦然:除了“forEach”和“forEachOrdered”之外,串行流上的所有操作都保证在当前线程中执行?
我已经在谷歌上搜索了有关“Java”,“Stream”和“ThreadLocal”组合的权威答案,但一无所获。关闭的事情是Brian Goetz对Stack Overflow上一个相关问题的回答,但它是关于顺序的,而不是线程,它只是关于“forEach”,而不是其他流方法:Stream.forEach是否尊重顺序流的相遇顺序?