我有一个方法返回从自定义分割器生成的流;分离器并不安全。由于分离器并不安全,并且它保持状态,因此我想防止它并行运行。有没有办法prevent并行运行返回的流?
我无法找到任何执行此操作的文档或示例。我确实找到了一个sequential()
方法上的BaseStream
类,但这似乎并没有阻止用户调用parallel()
获得并行流。
并行流调用trySplit()
spliterator 的方法将您的任务拆分为几个部分。它是绝对合法 https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html#trySplit--回来null
from trySplit()
说“我拒绝分裂”。在这种情况下,从 spliterator 创建的流将按顺序执行,即使.parallel()
被明确调用。
然而,一般来说,您可以提供至少有限的并行性,以扩展AbstractSpliterator https://docs.oracle.com/javase/8/docs/api/java/util/Spliterators.AbstractSpliterator.html班级。它提供了默认的trySplit()
读取一些输入元素的实现,调用您的tryAdvance()
方法,将它们存储到数组中并返回该数组上的 spliterator,因此这部分可以单独处理并完全独立于您的 spliterator。这是“穷人”并行化,但如果下游管道操作非常耗时,仍然可以提高速度。
最后请注意,在大多数简单情况下,Spliterator 实现不应该是线程安全的。如果您提供自己的高效trySplit()
实现时,保证了原始的 spliterator 和新创建的 spliterator 将以完全独立的方式进行处理。因此,如果您在拆分后不修改前缀和后缀拆分器中的共享状态,则不应该关心线程安全。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)