7

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

我找不到任何这样做的文档或示例。我确实sequential()在该类上找到了一个方法BaseStream,但这似乎并不能阻止用户随后调用parallel()以获取并行流。

4

2 回答 2

5

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

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

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

于 2015-11-21T03:04:42.607 回答
0

默认情况下,流是同步的,所以如果你正确地记录你的库,这个问题就无关紧要了。用户有责任确保他们使用的库是线程安全的。只是表明你的不是。

如果您可以在服务器端发送线程 ID 并通过 API 在客户端接收它,有一种方法可以检查线程:

Thread.currentThread().getId()

并在收到时将其与您的线程 ID 进行比较。抛出Exception一个明确的错误消息“不是线程安全的!” 当它们不同时。

于 2015-11-20T22:41:00.753 回答