如何限制Stream按顺序运行,并阻止它并行运行?

Mik*_*der 6 java java-stream spliterator

我有一个方法返回从自定义spliterator生成的流; 分裂器不是安全的.由于分裂器不是踏板安全的,并且它保持状态,我想防止它并行运行.有没有办法阻止返回的流并行运行?

我无法找到任何执行此操作的文档或示例.我确实sequential()BaseStream类上找到了一个方法,但这似乎并没有阻止用户调用parallel()以获得并行流.

Tag*_*eev 5

并行流调用trySplit()拆分器的方法将您的任务拆分为几个部分。从说“我拒绝分裂”回来是绝对合法的。在这种情况下,即使被显式调用,从拆分器创建的流也将按顺序执行。nulltrySplit().parallel()

但是,通常您可以提供至少有限的并行扩展AbstractSpliterator类。它提供了默认trySplit()实现,它读取一些调用您的tryAdvance()方法的输入元素,将它们存储到数组中并返回该数组上的拆分器,因此这部分可以单独处理并且完全独立于您的拆分器。这是“穷人”并行化,但如果下游管道操作耗时,仍然可以提高速度。

最后请注意,在大多数简单情况下,Spliterator 实现不应该是线程安全的。如果您提供自己的高效trySplit()实现,则可以保证以完全独立的方式处理原始拆分器和新创建的拆分器。所以如果你在拆分后不修改前缀和后缀拆分器中的共享状态,你应该不关心线程安全。