【发布时间】:2015-02-21 22:29:23
【问题描述】:
Java 8 以重载的Arrays.sort() 方法的形式引入了一种用于数组多线程排序的并行算法。
为什么不提供Collections.parallelSort(),用于List的多线程排序?
【问题讨论】:
-
list.parallelStream().sorted().collect(...)? -
List的性质允许它们以不同的方式排序:很容易剪切和插入元素或整个升序“运行”从列表中的任何位置到任何位置。在数组中插入或删除需要移动它之后的每个元素。因此在数组的并行排序中,元素在其本地集群中排序,然后全局合并,但没有理由将List排序限制为相同的机制。 -
其实这不是重复的;这是一个基本原理问题,而不是一个如何做的问题。数组允许简单的并行排序,因为它们可以很容易地划分为线程可以独立工作的块,具有已知的数据访问性能特征,因此我们知道就地并行排序实际上是实用的。对于 List,我们无法保证就地并行排序是否可行。
-
@BrianGoetz 是的,我同意。我已投票决定重新开放。
-
@JeffreyBosboom 对于数组以外的数据结构,就地排序充满了太多的“如果”和“可能”,很难确保良好的并行性。对于任意列表,您可以使用
list.stream().sorted().collect(...)。我知道拥有神奇的“列表并行排序”是多么有吸引力,但另一方面,没有人会对并行加速不佳的实现感到满意。
标签: java multithreading list sorting java-8