【问题标题】:Arrays.sort (with Comparator) - same or different thread?Arrays.sort (with Comparator) - 相同或不同的线程?
【发布时间】:2015-10-10 20:52:31
【问题描述】:

Arrays.sort 方法中的比较器代码是否在同一个线程中调用 调用排序或不同的线程?

我是在 JDK 8 的上下文中提出这个问题的。

我认为答案是它在同一个线程中调用,但我不是 100% 确定。如果回答这个问题的人提供一些参考资料或其他类型的详细解释(除了简单的是或否),我会很高兴。

【问题讨论】:

  • 太糟糕了,这个方法的源代码被锁定了,没有人可以检查它:( .... ;) (编辑:哦,你检查了源代码?)
  • 恕我直言,最近这里的人只是发表了讽刺性的言论,并且投票太快了,甚至没有考虑太多。
  • java docs 没有提到任何关于多线程的内容,这表明 Arrays.sort 应该在它被调用的同一线程中运行。
  • 您可以简单地查看源代码。找出答案的最佳方法:) 对我来说看起来不像是多线程的。
  • @peter.petrov 我不认为该规则写在某处,但它是一个重要的实现细节,编写良好的 java 文档应该包含这些细节。是的,最好的方法是查看源代码,如果你使用 IntelliJ IDEA,你可以很容易地做到这一点。

标签: java sorting comparator


【解决方案1】:

答案是否定的。排序(在Arrays.sort 中)是使用DualPivotQuicksort 实现的,来自文档:

这个类实现了 Vladimir 的 Dual-Pivot Quicksort 算法 雅罗斯拉夫斯基、乔恩·本特利和乔什·布洛赫。该算法提供 O(n log(n)) 在许多数据集上的性能,导致其他快速排序 降级到二次性能,并且通常比 传统的(单轴)快速排序实现。所有暴露的方法 是包私有的,旨在从公共方法调用(在 class Arrays) 在执行任何必要的数组边界检查和 将参数扩展为所需的形式。

正如您在the implementation 中看到的那样 - 它不会启动任何线程。

此外,还有parallelSort 方法使用 ForkJoin 公共池来执行并行执行。这是非常明确的,正如其他一些评论者已经提到的那样 - JDK API 对此类问题含糊其辞的可能性非常小。

【讨论】:

  • 他的意思是使用比较器的排序方法,即this
  • @loan 在这种情况下,答案仍然是“否”,因为它使用了旧版 mergesort,它再次 - 不使用任何线程。
  • 当你得到 +2 时,这对我来说已经足够好了。感谢您的确认。正如我所指出的,我得出了相同的结论,它是单线程的。谢谢。
  • @alfasin 我知道。我在评论中引用了这个方法,但 peter.petrov 说这无关紧要。只是想说解释没有意义,因为它指的是另一种方法。
猜你喜欢
  • 2021-05-23
  • 2012-04-05
  • 2019-03-25
  • 1970-01-01
  • 2016-11-15
  • 2014-11-05
  • 2015-09-28
  • 1970-01-01
  • 2011-05-18
相关资源
最近更新 更多