我遇到了这段使用Java流的代码,特别是parallelStream(),目的是从oracle数据库中收集一些数据。请参阅下面的这种情况:
ForkJoinPool threadPool = new ForkJoinPool(Math.min(Runtime.getRuntime().availableProcessors(), parallelism));
try {
Optional<C> res = threadPool.submit(new Callable<Optional<C>>() {
@Override
public Optional<C> call() throws Exception {
return splitByLimit(range, rangeLimit)
.parallelStream()
.map(rangeLimitedFunction::apply)
.reduce((list, items) -> {
list.addAll(items);
return list;
});
}
}).get();
据我了解,这是如何工作的:
我的问题是试图通过简化为一个列表来施加潜在的种族条件。这些线程中有很多不可能试图将内容添加到结果列表中并可能破坏数据吗?
这在很大程度上取决于在这种情况下使用的List的实现。
也就是说,使用flatMap和收集器来利用Java paralell流的线程安全性并避免非线程安全列表实现的潜在陷阱,这种代码优势会更好。
就是说,paralellStreams不能为IO操作带来太多好处。它们以处理器繁重的操作为目标,通常只有在超过15000(IIRC)操作(即流迭代次数乘以cpu繁重的流操作)时才能获得回报,这种情况很少见。