У меня есть следующий метод, использующий CompletableFuture
, например:
public AClass aMethod() {
CompletableFuture<SomeClassA> someClassAFuture =
CompletableFuture.supplyAsync(() -> someMethodThatReturnsA());
CompletableFuture<SomeClassB> someClassBFuture =
CompletableFuture.supplyAsync(() -> someMethodThatReturnsB());
CompletableFuture<SomeClassC> someClassCFuture =
CompletableFuture.supplyAsync(() -> someMethodThatReturnsC());
CompletableFuture.allOf(someClassAFuture, someClassBFuture, someClassCFuture).join();
return new AClass(someClassAFuture.join(), someClassBFuture.join(), someClassCFuture.join());
}
В этом коде возникает проблема взаимоблокировки, когда потоки T
одновременно вводят метод, если в пуле объединения вил меньше потоков, чем T * 3
(поскольку ни один из вызовов allOf
не может быть завершен, и они не вернутся к пул текущих занятых тем).
Единственный способ решить эту проблему - ограничить одновременные потоки внутри метода (используя аннотацию Spring @Async
с исполнителем потоков) или увеличить потоки в пуле соединений вилки.
Я хотел бы найти лучшее решение, в котором я мог бы полностью забыть о размере пула потоков. Как я могу переписать это с помощью Reactor или Akka?