【问题标题】:Multithreaded merge sort Stack Overflow error多线程合并排序堆栈溢出错误
【发布时间】:2020-03-26 05:19:20
【问题描述】:

我正在尝试进行多线程合并排序,但遇到了堆栈溢出错误,我不确定是什么原因造成的。

public static void concurrentMergeSort(int[] arr, int threadCount) {
    if(threadCount <= 1){
        regularMergeSort(arr);
        return;
    }
    int middle = arr.length/2;
    int[] left = Arrays.copyOfRange(arr, 0, middle); //Says error here
    int[] right = Arrays.copyOfRange(arr, middle, arr.length);
    concurrentMergeSort(left);//Says error here
    concurrentMergeSort(right);
    Thread leftSort = new Thread(new Sorting(left, threadCount));
    Thread rightSort = new Thread(new Sorting(right, threadCount));

    try{
        leftSort.join();
        rightSort.join();
    }
    catch (Exception ex){
        ex.printStackTrace();
    }
    merge(arr, left, right);
}
public static void regularMergeSort(int[] arr){
    if(arr.length == 1){
        return;
    }
    int middle = arr.length/2;
    int[] left = Arrays.copyOfRange(arr, 0, middle);
    int[] right = Arrays.copyOfRange(arr, middle, arr.length);
    regularMergeSort(left);
    regularMergeSort(right);
    merge(arr, left, right);
}

}

我在想也许是线程数永远不会减少,但是当我修改线程数时,我仍然得到相同的结果。在我添加常规合并排序和并发合并排序以将其分开之前,它也一直在工作。我也只添加了常规合并排序,因为仅使用并发合并排序方法几乎没有提高速度,并且这种合并排序修改的主要目的是增加使用多线程进行排序所需的时间。

【问题讨论】:

    标签: multithreading sorting recursion merge


    【解决方案1】:

    你从regularMergeSort返回的条件是:

    if(arr.length == 1)
    

    当 middle = 0 时,你最终会创建一个空数组;并且这个终止条件不会被命中,并且会有无限循环。将此条件更改为:

    if(arr.length <= 1)
    

    假设你的合并函数处理空数组,你应该很好。

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      相关资源
      最近更新 更多