在 Java 中,“多线程如何排序”通常有两种理解:
下面分别说明,并给出常见做法和示例代码。
Arrays.parallelSortimport java.util.Arrays;
public class ParallelSortDemo {
public static void main(String[] args) {
int[] arr = {5, 3, 8, 1, 9, 2};
Arrays.parallelSort(arr);
System.out.println(Arrays.toString(arr));
}
}
int[]、long[]、double[] 等parallelStream().sorted()import java.util.*;
import java.util.stream.Collectors;
public class ParallelStreamSort {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(5, 3, 8, 1, 9, 2);
List<Integer> sorted = list.parallelStream()
.sorted()
.collect(Collectors.toList());
System.out.println(sorted);
}
}
⚠ 注意:
parallelStream 不一定总是更快import java.util.*;
import java.util.concurrent.*;
public class MultiThreadSort {
static class SortTask extends RecursiveAction {
int[] arr;
int left, right;
SortTask(int[] arr, int left, int right) {
this.arr = arr;
this.left = left;
this.right = right;
}
@Override
protected void compute() {
if (right - left <= 1000) {
Arrays.sort(arr, left, right + 1);
} else {
int mid = (left + right) / 2;
invokeAll(
new SortTask(arr, left, mid),
new SortTask(arr, mid + 1, right)
);
merge(arr, left, mid, right);
}
}
void merge(int[] a, int l, int m, int r) {
int[] temp = Arrays.copyOfRange(a, l, r + 1);
int i = 0, j = m - l + 1, k = l;
while (i <= m - l && j < temp.length) {
if (temp[i] <= temp[j]) a[k++] = temp[i++];
else a[k++] = temp[j++];
}
while (i <= m - l) a[k++] = temp[i++];
}
}
public static void main(String[] args) {
int[] arr = new Random().ints(100000).toArray();
ForkJoinPool.commonPool().invoke(
new SortTask(arr, 0, arr.length - 1)
);
System.out.println(Arrays.toString(Arrays.copyOf(arr, 20)));
}
}
如果是:
多个线程不断往集合里放数据,最后要整体有序
✅ 正确做法:
List<Integer> list = Collections.synchronizedList(new ArrayList<>());
// 多线程 add
// ...
List<Integer> sorted = list.stream().sorted().toList();
❌ 不建议:
PriorityBlockingQueue 做大规模排序(只适合流式取最小/最大)| 场景 | 推荐方式 |
|---|---|
| 普通排序 | Arrays.sort |
| 大数据排序 | Arrays.parallelSort |
| 对象排序 | parallelStream().sorted() |
| 学习算法 | 多线程归并 |
| 实时取最值 | PriorityBlockingQueue |
如果你有具体场景(比如:
可以告诉我,我可以给你更针对性的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。