ForkJoinPool и RecursiveTask приводят к взаимоблокировке, когда соединение вызывается в другом потоке, чем разветвление.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 ForkJoinPool и RecursiveTask приводят к взаимоблокировке, когда соединение вызывается в другом потоке, чем разветвление.

Сообщение Anonymous »

Программа ниже никогда не заканчивается:

Код: Выделить всё

void main() {
try (Fibonacci fibonacci = new Fibonacci()) {
IO.println(fibonacci.calculate(9));
}
}

public static class Fibonacci implements AutoCloseable {

private final ConcurrentHashMap cache;
private final ForkJoinPool pool;

public Fibonacci() {
cache = new ConcurrentHashMap();
pool = new ForkJoinPool(2);
}

public long calculate(int n) {
return pool.invoke(new FibonacciTask(n));
}

private class FibonacciTask extends RecursiveTask {

private final int n;

private FibonacciTask(int n) {
this.n = n;
}

@Override
protected Long compute() {
IO.println("[%d] Start".formatted(n));
if (n < 3) {
IO.println("[%d] End".formatted(n));
return 1L;
}

FibonacciTask previousValue = cache.putIfAbsent(n, this);
if (previousValue != null) {
IO.println("[%d] Wait".formatted(n));
long cachedValue = previousValue.join(); // 

Подробнее здесь: [url]https://stackoverflow.com/questions/79833584/forkjoinpool-and-recursivetask-lead-to-deadlock-when-join-is-called-in-a-differe[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»