Files
SSPR_25/abakarov_arslan_lab_1/ForkJoinMatrixDivider.java
Arslan 28f40483ad abakarov_arslan_lab_1
abakarov_arslan_lab_1
2025-03-21 23:16:33 +04:00

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);
}
}