해결하는 데 더 간단한 문제가 필요합니다. 1000 개의 무작위 X 값과 1000 개의 무작위 Y 값의 병렬 합계를 해결해야합니다. 나는 자바의 병렬 ForkJoin 프레임 워크를 사용하고있다. 단일 계산 방법을 사용하면 완전히 다른 경로에서 X 값과 Y 값의 합계를 계산할 수 없습니다.둘 이상의 사용 방법 Javaello의 ForkJoin Framework에서 계산 방법을
이상 나는 X * Y, 즉 Σxiyi의 합계를 계산해야합니다. 하나의 단일 스레드에서 가로 지르는 X 값은 별도의 작업을 할당하고 Y는 스레드 풀에 별도의 작업으로 삽입됩니다. 그렇다면 어떻게 X와 Y 값을 동시에 곱할 수 있습니까? 즉, X * Y ==> (X = 100, Y = 150)입니까? 첫 번째 스레드는 Y.에 X 및 초에 작동
코드 :
공용 클래스 RegressionLineForkJoin {
//private static final ForkJoinPool forkJoinPool = new ForkJoinPool(2); // use only 2 processors
private static Random r = new Random();
private static final int NR_OF_VALUES = 1000; // X & Y VALUES
private static final int THRESHOLD = 100; // need to calculate Threshold value.
private static class RegressionLineForkJoinTask extends RecursiveTask<Integer>
{
private int m_Start;
private int m_End;
public RegressionLineForkJoinTask(int a_start,int a_end)
{
this.m_Start = a_start;
this.m_End = a_end;
}
public Integer compute()
{
Integer Sum = 0;
if(this.m_End - this.m_Start < THRESHOLD)
{
calculateSum(this.m_Start,this.m_End);
}
else
{
int split = (this.m_Start + this.m_End)/2;
RegressionLineForkJoinTask oRegressionLineTask_1 = new RegressionLineForkJoinTask(this.m_Start , split);
RegressionLineForkJoinTask oRegressionLineTask_2 = new RegressionLineForkJoinTask(split+1 , this.m_End);
// Invoke the tasks in parallel
invokeAll(oRegressionLineTask_1,oRegressionLineTask_2);
Sum += oRegressionLineTask_1.join();
Sum += oRegressionLineTask_2.join();
//Sum
}//end of else
return Sum;
}
public static void main(String[ ] args)
{
RegressionLineForkJoinTask oRegressionLineForkJoinTask_X = new RegressionLineForkJoinTask(0,NR_OF_VALUES);
RegressionLineForkJoinTask oRegressionLineForkJoinTask_Y = new RegressionLineForkJoinTask(0,NR_OF_VALUES);
Integer Sum_X_Values = forkJoinPool.invoke(oRegressionLineForkJoinTask_X);
Integer Sum_Y_Values = forkJoinPool.invoke(oRegressionLineForkJoinTask_Y);
System.out.println("in main after forkjoin.invoke()");
}
private static double nextRandomFunctionValue(int a_startInex,int a_endIndex)
{
double randomValue = 0.0;
randomValue = a_startInex + (a_endIndex - a_startInex) * r.nextDouble();
return randomValue;
}//end of nextRandomFunctionValue
private static double calculateSum(int a_startIndex, int a_endIndex)
{
double sumValue = 0.0;
double RandomeValue = 0.0;
for(int index = a_startIndex; index< a_endIndex; index++)
{
RandomeValue = nextRandomFunctionValue(a_startIndex,a_endIndex);
sumValue += RandomeValue;
}//end of for
return sumValue;
}
}
}