0

我正忙于并行编程任务,我真的被困住了。老实说,我不完全确定每种方法的工作原理,但我想我有一个想法。

我需要对一组连续值求和(并行)。似乎很容易,但每次尝试时我都会得到 0 作为答案。我真的不知道为什么。

class SumThreaded extends RecursiveTask<Integer> {
    static int SEQUENTIAL_THRESHOLD = 10000;
    double lo=0.0;
    double hi=0.0;

    long[] arr;

    public SumThreaded(long[] array, double a, double b) {
        arr=array;
        lo=a;
        hi=b;


    }

    public Integer compute() {

        //System.out.println(mid);
        if(hi - lo <= SEQUENTIAL_THRESHOLD) {
            int ans = 0;
            for(int i= (int) lo; i < hi; ++i)
                ans += arr[i];
            return ans;
        }
        else {
            SumThreaded left = new SumThreaded(arr,lo,(hi+lo)/2.0);
            SumThreaded right = new SumThreaded(arr,(hi+lo)/2.0,hi);
            left.fork();
            int rightAns = right.compute();
            int leftAns = left.join();
            return leftAns+rightAns;

        }
    }


    public static void main(String args[]){

        int size = 1000000;
        long [] testArray=new long[size]; 

        for(int i=0;i<size;i++){
            testArray[i]=i+1;
        }

        SumThreaded t = new SumThreaded(testArray,0.0,testArray.length); 
        ForkJoinPool fjPool = new ForkJoinPool();
        int result =fjPool.invoke(t);
        System.out.println(result);

    }
}

任何帮助将不胜感激。

4

1 回答 1

1

您的问题似乎是您有两个单独的构造函数SumThreaded,其中只有一个设置了类的字段。当您long[] arraynewin 输入时sumArray,您将数组扔掉。您需要选择是使用ints 还是longs (并且大数组的总和可能需要 a long),然后确保您的值设置得当。调试和设置断点compute会告诉你这一点。

于 2013-09-16T01:56:35.207 回答