|
1 | 1 | package ru.javaops.masterjava.matrix; |
2 | 2 |
|
| 3 | +import java.util.ArrayList; |
| 4 | +import java.util.List; |
3 | 5 | import java.util.Random; |
4 | 6 | import java.util.concurrent.ExecutionException; |
5 | 7 | import java.util.concurrent.ExecutorService; |
| 8 | +import java.util.concurrent.ThreadPoolExecutor; |
6 | 9 |
|
7 | 10 | /** |
8 | 11 | * gkislin |
9 | 12 | * 03.07.2016 |
10 | 13 | */ |
11 | 14 | public class MatrixUtil { |
| 15 | + static final int MATRIX_SIZE = 1000; |
| 16 | + static final int THREAD_NUMBER = 10; |
12 | 17 |
|
13 | | - // TODO implement parallel multiplication matrixA*matrixB |
| 18 | + // T_O_D_O implement parallel multiplication matrixA*matrixB |
14 | 19 | public static int[][] concurrentMultiply(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException, ExecutionException { |
15 | 20 | final int matrixSize = matrixA.length; |
16 | 21 | final int[][] matrixC = new int[matrixSize][matrixSize]; |
17 | | - |
| 22 | +// List<CallableTask> tasks = new ArrayList<>(); |
| 23 | +// executor.invokeAll(tasks); |
| 24 | + for (int i = 0; i < MATRIX_SIZE; i++) { |
| 25 | + for (int j = 0; j < MATRIX_SIZE; j++) { |
| 26 | + executor.submit(new Task(matrixA, matrixB, matrixC, i, j)); |
| 27 | + } |
| 28 | + } |
| 29 | + while (((ThreadPoolExecutor) executor).getQueue().size() > 0) ; |
18 | 30 | return matrixC; |
19 | 31 | } |
20 | 32 |
|
@@ -58,4 +70,29 @@ public static boolean compare(int[][] matrixA, int[][] matrixB) { |
58 | 70 | } |
59 | 71 | return true; |
60 | 72 | } |
| 73 | + |
| 74 | + static class Task implements Runnable { |
| 75 | + private final int[][] matrixA; |
| 76 | + private final int[][] matrixB; |
| 77 | + private final int[][] matrixC; |
| 78 | + private final int i; |
| 79 | + private final int j; |
| 80 | + |
| 81 | + public Task(int[][] matrixA, int[][] matrixB, int[][] matrixC, int i, int j) { |
| 82 | + this.matrixA = matrixA; |
| 83 | + this.matrixB = matrixB; |
| 84 | + this.matrixC = matrixC; |
| 85 | + this.i = i; |
| 86 | + this.j = j; |
| 87 | + } |
| 88 | + |
| 89 | + @Override |
| 90 | + public void run() { |
| 91 | + int sum = 0; |
| 92 | + for (int k = 0; k < matrixA.length; k++) { |
| 93 | + sum += matrixA[i][k] * matrixB[k][j]; |
| 94 | + } |
| 95 | + matrixC[i][j] = sum; |
| 96 | + } |
| 97 | + } |
61 | 98 | } |
0 commit comments