Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-ForkJoin/MergeSort堆栈溢出_Java_Multithreading_Fork Join - Fatal编程技术网

Java-ForkJoin/MergeSort堆栈溢出

Java-ForkJoin/MergeSort堆栈溢出,java,multithreading,fork-join,Java,Multithreading,Fork Join,我正在使用ForkJoin框架实现一个合并排序/插入排序解决方案。但是,我得到了一个stackoverflow错误,似乎无法跟踪问题发生的位置。该解决方案旨在对1-10000000之间的一系列随机值进行排序。对于从0到100的范围,我使用插入排序,对于范围更大的范围,我使用合并排序 主要方法: class Assignment3 { public static void main(String[] args) { long startTime1 = Sys

我正在使用ForkJoin框架实现一个合并排序/插入排序解决方案。但是,我得到了一个stackoverflow错误,似乎无法跟踪问题发生的位置。该解决方案旨在对1-10000000之间的一系列随机值进行排序。对于从0到100的范围,我使用插入排序,对于范围更大的范围,我使用合并排序

主要方法:

class Assignment3 {
  public static void main(String[] args) {              
    long startTime1 = System.currentTimeMillis();
    int S = 10000000;
    int d[] = new int[S];

    for(int j=0;j<d.length;j++) {
        d[j] = (int)(Math.random()*10000);
    }

    ForkJoinPool fjpool = new ForkJoinPool();
    // Array, lb, ub
    fjpool.invoke(new Ass3Q2(d,0,d.length));

    long endTime1 = System.currentTimeMillis();
    long runningTime1 = endTime1 - startTime1;
    System.out.println(runningTime1+" millisecs ("+(runningTime1/1000.0)+")");

    boolean sorted = true;
    for(int i=0;i<d.length-1;i++) {
        if(d[i] > d[i+1]) {
            sorted = false;
        }
    }
    System.out.println("Sorted List: "+sorted);
   }
 }

mergeSort
使用相同的参数调用自身:
mergeSort(a,l,u)
(如果我们输入
if
),这就是stackoverflow错误的原因

static void mergeSort(int a[], int l, int u) {
    if(l+1 < u) {
        int mid = (l+u)/2;
        mergeSort(a,l,u); // this call is most likely unwanted
        mergeSort(a,mid,u);
        merge(a,l,mid,u);
    }
}
静态void合并排序(int a[],int l,int u){
如果(l+1
发布堆栈跟踪。“你到底从哪里得到这么多?”埃德哈内德抱歉,我已经更新了操作
Exception in thread "main" java.lang.StackOverflowError
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.util.concurrent.ForkJoinTask.getThrowableException(Unknown Source)
at java.util.concurrent.ForkJoinTask.reportResult(Unknown Source)
at java.util.concurrent.ForkJoinTask.join(Unknown Source)
at java.util.concurrent.ForkJoinPool.invoke(Unknown Source)
at Assignment3.main(Assignment3.java:71)
Caused by: java.lang.StackOverflowError
at Ass3Q2.mergeSort(Assignment3.java:150)
at Ass3Q2.mergeSort(Assignment3.java:150)
at Ass3Q2.mergeSort(Assignment3.java:150)
at Ass3Q2.mergeSort(Assignment3.java:150)
at Ass3Q2.mergeSort(Assignment3.java:150)
at Ass3Q2.mergeSort(Assignment3.java:150)
static void mergeSort(int a[], int l, int u) {
    if(l+1 < u) {
        int mid = (l+u)/2;
        mergeSort(a,l,u); // this call is most likely unwanted
        mergeSort(a,mid,u);
        merge(a,l,mid,u);
    }
}