我有一个方法可以返回从自定义spliterator生成的流;分裂器不是安全的。由于分裂器不是踏板安全的,并且它保持状态,我想防止它并行运行。有没有办法阻止返回的流并行运行?
我无法找到执行此操作的任何文档或示例。我确实在sequential()
类上找到了BaseStream
方法,但这似乎并不妨碍用户随后调用parallel()
来获取并行流。
答案 0 :(得分:4)
并行流调用spliterator的trySplit()
方法将您的任务拆分为多个部分。它是absolutely legit从null
返回trySplit()
说"我拒绝拆分"。在这种情况下,即使显式调用了.parallel()
,从spliterator创建的流也将按顺序执行。
但是,一般来说,您可以提供至少有限的并行性扩展AbstractSpliterator
类。它提供了默认的trySplit()
实现,它读取一些调用你的tryAdvance()
方法的输入元素,将它们存储到数组中并返回该数组上的spliterator,因此这部分可以单独处理并完全独立于你的spliterator。这是“穷人”#34;并行化,但如果下游管道操作耗时,仍然可以提高速度。
最后请注意,在大多数简单情况下,Spliterator实现不应该是线程安全的。如果您提供自己的高效trySplit()
实施,则可以保证原始的分裂器和新创建的分裂器将以完全独立的方式进行处理。因此,如果您在拆分后不修改前缀和后缀拆分器中的共享状态,则不应该关心线程安全。
答案 1 :(得分:0)
默认情况下,Streams是同步的,因此如果您正确记录库,问题就无关紧要了。用户有责任确保他们使用的库是线程安全的。只是明白你的不是。
如果您可以在服务器端发送线程ID并通过API在客户端接收线程ID,则可以检查线程:
Thread.currentThread().getId()
并在收到时将其与您的主机ID进行比较。抛出Exception
,并显示错误消息“Not Thread-Safe!”当它们不同时。