forked from Alexey/DAS_2024_1
45 lines
1.5 KiB
Java
45 lines
1.5 KiB
Java
|
import java.util.concurrent.ExecutorService;
|
||
|
import java.util.concurrent.Executors;
|
||
|
import java.util.concurrent.TimeUnit;
|
||
|
|
||
|
public class MatrixMultiplication {
|
||
|
public static int[][] multiply(int[][] matrixA, int[][] matrixB, int numThreads) {
|
||
|
int n = matrixA.length;
|
||
|
int[][] result = new int[n][n];
|
||
|
|
||
|
if (numThreads == 1) {
|
||
|
// Последовательное умножение
|
||
|
for (int i = 0; i < n; i++) {
|
||
|
multiplyRow(matrixA, matrixB, result, i);
|
||
|
}
|
||
|
} else {
|
||
|
// Многопоточное умножение
|
||
|
ExecutorService executor = Executors.newFixedThreadPool(numThreads);
|
||
|
|
||
|
for (int i = 0; i < n; i++) {
|
||
|
final int row = i;
|
||
|
executor.submit(() -> multiplyRow(matrixA, matrixB, result, row));
|
||
|
}
|
||
|
|
||
|
executor.shutdown();
|
||
|
try {
|
||
|
// Ожидаем завершения всех задач
|
||
|
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
|
||
|
} catch (InterruptedException e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
private static void multiplyRow(int[][] matrixA, int[][] matrixB, int[][] result, int row) {
|
||
|
int n = matrixA.length;
|
||
|
for (int j = 0; j < n; j++) {
|
||
|
for (int k = 0; k < n; k++) {
|
||
|
result[row][j] += matrixA[row][k] * matrixB[k][j];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|