**关闭。**此题需要debugging details。目前不接受答复。
编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
18小时前关闭
Improve this question
我有1000个产品,需要并行执行,输出的结果也是一个集合。我需要保持顺序,所以我使用了parallelStream()
和forEachOrdered
,如下所示
products.parallelStream().forEachOrdered(pdt ->
finalProd.add(mapProduct(pdt)));
我已经测试了代码,它似乎不是有效的,但比使用stream()
更好。根据oracle documentation
forEachOrdered方法,它按照源指定的顺序处理流的元素,而不管您是串行还是并行执行流。请注意,如果对并行流使用forEachOrdered等操作,可能会失去并行性的好处。
如果我们使用forEachOrdered
,我们没有充分利用并行性的潜力,有人能建议一个更好的方法来处理并行任务吗?我只担心最后一次输出的顺序,不关心执行的顺序
1条答案
按热度按时间0aydgbwb1#
这里假设
finalProd
Map了products
中的乘积,并且顺序相同:parallelStream()
方法创建一个并行流,map
操作维护stream
的顺序,最后收集器将它们收集到一个也遵守顺序的列表中。您可以在
stream
包javadoc中检查此声明:订购流可以具有或可以不具有定义的相遇顺序。流是否具有相遇顺序取决于源和中间操作。某些流源(如List或数组)本质上是有序的,如果流是有序的,则大多数操作都被限制为按其遇到顺序对元素进行操作;如果流的源是包含[1,2,3]的List,则执行map(x -〉x*2)的结果必须是[2,4,6]。..
...
对于并行流,放松排序约束有时可以实现更有效的执行。某些聚合操作,如过滤重复项(distinct())或分组归约(Collectors.如果元素的排序不相关,则groupingBy()可以更有效地实现。类似地,本质上与遇到顺序相关联的操作(例如limit())可能需要缓冲以确保正确的排序,从而破坏并行性的益处。**如果流有遇到顺序,但用户并不特别关心该遇到顺序,则使用unordered()**显式地对流进行反排序可以提高某些有状态或终端操作的并行性能。然而,大多数流流水线(诸如上面的“块的权重之和”示例)即使在排序约束下仍然高效地并行化。
重点是我的,但由于我们只应用遵守顺序的操作,因此可以确保结果的顺序。