Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. private class MatrixCalculation extends RecursiveTask<Integer> {
  2.  
  3.   private int[][] matrix = null;
  4.                
  5.     public MatrixCalculation(int[][] matrix) {
  6.       this.matrix = matrix;
  7.     }
  8.                
  9.     @Override
  10.     protected Integer compute() {
  11.       if(matrix.length == 1) {
  12.         return matrix[0][0];
  13.       } else {
  14.         //Particionate original matrix in four identical smaller matrix.
  15.         MatrixCalculation matrixCalculation1 = new                       MatrixCalculation(splitMatrixForGivenQuadrant(matrix, 0,0));
  16.         matrixCalculation1.fork();
  17.         MatrixCalculation matrixCalculation2 = new MatrixCalculation(splitMatrixForGivenQuadrant(matrix, 1,0));
  18.         matrixCalculation2.fork();
  19.         MatrixCalculation matrixCalculation3 = new MatrixCalculation(splitMatrixForGivenQuadrant(matrix, 0,1));
  20.         matrixCalculation3.fork();
  21.         MatrixCalculation matrixCalculation4 = new MatrixCalculation(splitMatrixForGivenQuadrant(matrix, 1,1));
  22.                                
  23.         return matrixCalculation4.compute() + matrixCalculation1.join() + matrixCalculation2.join() + matrixCalculation3.join() ;
  24.                        
  25.         }
  26.       }
  27.                
  28.       private int[][] splitMatrixForGivenQuadrant(int[][] matrix, int quadrantX, int quadrantY) {
  29.        
  30.         int[][] firstMatrix = new int[matrix.length/2][matrix.length/2];
  31.                  
  32.         for(int i=0;i<firstMatrix.length;i++) {
  33.           for(int j=0;j<firstMatrix[i].length;j++) {
  34.             firstMatrix[i][j] = matrix[i+quadrantX*matrix.length/2][j+quadrantY*matrix.length/2];
  35.           }
  36.         }
  37.                        
  38.         return firstMatrix;
  39.                        
  40.       }
  41.                
  42.     }
  43.  
  44.  private static final int NUMBER_OF_PROCESSORS = 2;
  45.                
  46.  public static void main(String[] args) {
  47.    ForkJoinTaskExample forkJoinTaskExample = new ForkJoinTaskExample();
  48.                
  49.    ForkJoinPool forkJoinPool = new ForkJoinPool(NUMBER_OF_PROCESSORS);
  50.  
  51.    int [][] matrix = new int[][]{{2,1},{3,4}};
  52.    MatrixCalculation matrixCalculation = forkJoinTaskExample.new MatrixCalculation(matrix);
  53.                
  54.    forkJoinPool.invoke(matrixCalculation);
  55.    System.out.println(matrixCalculation.getRawResult());            
  56. }