Попробуй вот так:
import java.util.concurrent.*;
class CMatrix {
private double det = 0;
int availableProcessors = Runtime.getRuntime().availableProcessors();
ExecutorService executorService = Executors.newFixedThreadPool(availableProcessors);
public void callback(Double[][] A, int N, Double[][] m, int j1) throws InterruptedException {
det += Math.pow(-1.0, 1.0 + j1 + 1.0) * A[0][j1] * determinant(m, N - 1, false);
}
/**
*
* @param A
* @param N
* @param isMain - if true then shutdown and await all threads
* return
* @throws InterruptedException
*/
public double determinant(Double A[][], int N, boolean isMain) throws InterruptedException {
//todo: if N=0
if (N == 1) {
det = A[0][0];
} else if (N == 2) {
det = A[0][0] * A[1][1] - A[1][0] * A[0][1];
} else {
for (int j1 = 0; j1 < N; j1++) {
Calculate calculate = new Calculate(A, N, j1);
// calculate.setcMatrix(this); //todo: you may call callback from other thread
Future<Double[][]> result = executorService.submit(calculate);
try {
callback(A, N, result.get(10, TimeUnit.SECONDS), j1);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
e.printStackTrace();
}
}
}
if (isMain) {
executorService.shutdown(); //it just signal. System will wait for all task completed.
executorService.awaitTermination(60, TimeUnit.MINUTES);
}
return det;
}
}
class Calculate implements Callable<Double[][]> {
private int N;
private Double[][] A;
private int j1;
public Calculate(Double[][] a, int n, int j1) {
N = n;
A = a;
this.j1 = j1;
}
private CMatrix cMatrix;
public void setcMatrix(CMatrix cMatrix) {
this.cMatrix = cMatrix;
}
public CMatrix getcMatrix() {
return cMatrix;
}
@Override
public Double[][] call() throws Exception {
Double[][] m = new Double[N - 1][];
for (int i = 1; i < N; i++) {//-----Надо это организовать в потоке
int j2 = 0;
for (int j = 0; j < N; j++) {
if (j == j1)
continue;
m[i - 1][j2] = A[i][j];
j2++;
}
}
return m;
}
}
Многопоточный рекурсивные функции это по хардкорному. Я даже понятия не имею что там будет со стеками вызовов.
Может лучше сначала используя многопоточность посчитать определители всех дополнительных миноров и записать их с параметрами в какой нибудь LinkedList, а потом, когда все задачи отработали, в одном цикле в главном потоке посчитать определитель.
P.S. Посмотри еще
forkjoin. Там есть RecursiveTask.
P.S.P.S. Вот тут рекурсивная сортировка
docs.oracle.com/javase/8/docs/api/java/util/concur...