【问题标题】:Why does Java 8 have Arrays.parallelSort() but not Collections.parallelSort()?为什么 Java 8 有 Arrays.parallelSort() 而没有 Collections.parallelSort()?
【发布时间】: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


【解决方案1】:

List 不一定允许高效实现与数组相同的并行排序算法。您可以直接将其应用于ArrayList,但很可能不能应用于LinkedList,因为它缺乏有效的随机访问。这种列表有高效的多线程排序算法,但它们与随机访问列表不同。

事实上,List 接口的线程安全实现可能根本不支持有效的外部多线程排序,因为同步。为这些提供通用排序算法是不可能的,实际上并行算法可能比顺序算法慢。

【讨论】:

  • 由于 List 是一个接口,它的子 LinkedList 由于这个答案不能支持并行排序,而 ArrayList 可以支持,并且由于这个问题 List 在不使用流的情况下没有并行排序。所以我们需要做 list.parallelStream().storted().collect(Collectors.toList());
猜你喜欢
  • 2014-12-03
  • 2019-05-23
  • 2016-03-11
  • 2014-08-04
  • 1970-01-01
  • 2016-02-06
  • 2016-06-28
  • 2018-02-27
  • 1970-01-01
相关资源
最近更新 更多