如何限制Stream顺序运行,并防止其并行运行?

迈克·里兰德

我有一个方法可以返回从自定义拆分器生成的流;分流器不安全。由于分隔符不安全,并且会保持状态,因此我想防止它并行运行。有没有办法防止返回的流并行运行?

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

塔吉尔·瓦列夫

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章