我正忙于并行编程任务,我真的被卡住了。说实话,我不完全确定每种方法的工作原理,但我认为我有一个想法。
我需要对一组连续值求和(并行)。看起来很简单,但每次尝试都会得到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);
}
}
非常感谢任何帮助。
答案 0 :(得分:1)
您的问题似乎是SumThreaded
有两个单独的构造函数,其中只有一个构造了类的字段。当你从long[] array
new
中的sumArray
进食时,你将数组扔掉。您需要选择是否使用int
或long
s(并且大数组的总和可能需要long
),然后确保您的值已设置适当。在compute
上调试和设置断点会向您显示此信息。