如何将流限制为 运行 顺序,并防止它并行 运行ning?

How to restrict a Stream to run sequentially, and prevent it from running in parallel?

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

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

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

如果您可以在服务器端发送线程 ID 并通过 API:

在客户端接收它,则有一种方法可以检查线程
Thread.currentThread().getId()

并在收到时将其与您的线程 ID 进行比较。当它们不同时抛出 Exception 并带有明确的错误消息 "Not Thread-Safe!"。

并行流调用拆分器的 trySplit() 方法将您的任务拆分为几个部分。 absolutely legit 到 return nulltrySplit() 说 "I refuse to split"。在这种情况下,即使 .parallel() 被显式调用,从您的拆分器创建的流也会按顺序执行。

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

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