64 lines
1.9 KiB
Java
64 lines
1.9 KiB
Java
import java.util.concurrent.RecursiveAction;
|
|
import java.util.concurrent.ForkJoinPool;
|
|
|
|
public class ForkJoinMatrixDivider {
|
|
public static void divideMatrix(int[][] matrix) {
|
|
long startTime = System.currentTimeMillis();
|
|
int max = findMax(matrix);
|
|
ForkJoinPool pool = new ForkJoinPool();
|
|
pool.invoke(new DivideTask(matrix, 0, matrix.length, max));
|
|
pool.shutdown();
|
|
|
|
long endTime = System.currentTimeMillis();
|
|
System.out.println("ForkJoinPool: " + (endTime - startTime) + "ms");
|
|
}
|
|
|
|
private static class DivideTask extends RecursiveAction {
|
|
private final int[][] matrix;
|
|
private final int start;
|
|
private final int end;
|
|
private final int max;
|
|
|
|
DivideTask(int[][] matrix, int start, int end, int max) {
|
|
this.matrix = matrix;
|
|
this.start = start;
|
|
this.end = end;
|
|
this.max = max;
|
|
}
|
|
|
|
@Override
|
|
protected void compute() {
|
|
if (end - start <= 10) { // porog
|
|
for (int i = start; i < end; i++) {
|
|
for (int j = 0; j < matrix[i].length; j++) {
|
|
matrix[i][j] /= max;
|
|
}
|
|
}
|
|
} else {
|
|
int mid = (start + end) / 2;
|
|
DivideTask left = new DivideTask(matrix, start, mid, max);
|
|
DivideTask right = new DivideTask(matrix, mid, end, max);
|
|
invokeAll(left, right);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static int findMax(int[][] matrix) {
|
|
int max = matrix[0][0];
|
|
for (int[] row : matrix) {
|
|
for (int value : row) {
|
|
if (value > max) {
|
|
max = value;
|
|
}
|
|
}
|
|
}
|
|
return max;
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
int[][] matrix = MatrixGenerator.generateMatrix(1000, 1000);
|
|
divideMatrix(matrix);
|
|
}
|
|
}
|
|
|