Когда вы вызываете printAllRecursive()
, вы создаете дополнительный поток для вызова compute()
, а затем вызываете printAllRecursive()
и снова создаете новый поток. Дополнительный поток не поможет вам. Похоже, ваш алгоритм неверен .
Посмотрите на правильный код для вычисления перестановок:
public class Main {
public static void main(String[] args) {
long start = System.nanoTime();
call();
long end = System.nanoTime();
System.out.println("time: " + (end - start) / 1000000);
}
private static void call() {
char[] elements = "ABCD".toCharArray();
int n = elements.length;
Permutation p = new Permutation();
p.printAllRecursive(elements, 0 , n-1);
System.out.println("number of permutations: " + p.counter);
}
}
class Permutation {
Integer counter = 0;
public void printAllRecursive(char[] elements, int l, int r) {
if (l == r) {
counter++;
//System.out.println(String.valueOf(elements));
} else {
for (int i = l; i <= r; i++) {
swap(elements, l, i);
printAllRecursive(elements, l+1, r);
swap(elements, l, i);
}
}
}
private void swap(char[] elements, int a, int b) {
char tmp = elements[a];
elements[a] = elements[b];
elements[b] = tmp;
}
}
Вы можете увидеть иллюстрацию этого алгоритма, чтобы лучше понять его, например, здесь
PS Как я уже говорил, ваша проблема не в многопоточности, но в любом случае я опишу, почему вы не можете просто добавить следующий код:
Thread thread = new Thread(() -> {
compute(elements);
});
thread.start();
Первое, что вы должны понять, это то, что Вы не можете изменить одну область памяти разными потоками. В вашем примере кода вы модифицируете поле counter
и массив elements
из разных потоков. Почему вы не можете изменить одну переменную из разных потоков? Например, поток1 хочет записать в ваш массив последовательность '777777777'
, и во время этого процесса записи поток2 хочет прочитать значения из массива. Итак, thread2 может читать значения '777456789'
, потому что thread1 все еще записывает данные в массив и еще не завершил sh. Таким образом, мы можем изменить Integer
на потокобезопасный AtomicInteger
и добавить synchronized
к сигнатуре swap
метода.