private class MatrixCalculation extends RecursiveTask<Integer> {
private int[][] matrix = null;
public MatrixCalculation(int[][] matrix) {
this.matrix = matrix;
}
@Override
protected Integer compute() {
if(matrix.length == 1) {
return matrix[0][0];
} else {
//Particionate original matrix in four identical smaller matrix.
MatrixCalculation matrixCalculation1 = new MatrixCalculation(splitMatrixForGivenQuadrant(matrix, 0,0));
matrixCalculation1.fork();
MatrixCalculation matrixCalculation2 = new MatrixCalculation(splitMatrixForGivenQuadrant(matrix, 1,0));
matrixCalculation2.fork();
MatrixCalculation matrixCalculation3 = new MatrixCalculation(splitMatrixForGivenQuadrant(matrix, 0,1));
matrixCalculation3.fork();
MatrixCalculation matrixCalculation4 = new MatrixCalculation(splitMatrixForGivenQuadrant(matrix, 1,1));
return matrixCalculation4.compute() + matrixCalculation1.join() + matrixCalculation2.join() + matrixCalculation3.join() ;
}
}
private int[][] splitMatrixForGivenQuadrant(int[][] matrix, int quadrantX, int quadrantY) {
int[][] firstMatrix = new int[matrix.length/2][matrix.length/2];
for(int i=0;i<firstMatrix.length;i++) {
for(int j=0;j<firstMatrix[i].length;j++) {
firstMatrix[i][j] = matrix[i+quadrantX*matrix.length/2][j+quadrantY*matrix.length/2];
}
}
return firstMatrix;
}
}
private static final int NUMBER_OF_PROCESSORS = 2;
public static void main(String[] args) {
ForkJoinTaskExample forkJoinTaskExample = new ForkJoinTaskExample();
ForkJoinPool forkJoinPool = new ForkJoinPool(NUMBER_OF_PROCESSORS);
int [][] matrix = new int[][]{{2,1},{3,4}};
MatrixCalculation matrixCalculation = forkJoinTaskExample.new MatrixCalculation(matrix);
forkJoinPool.invoke(matrixCalculation);
System.out.println(matrixCalculation.getRawResult());
}