в моем случае я б не хотел приплетать дополнительно к существующим тредам еще и FJP + мне бы хотелось чтоб один вызов хевилифтинга исполнялся одним тредом от начала и до конца. И поэтому заменил CompletableFuture на FutureTaskи. Получилось следующее:
java
class Util {
public static <T> T memoizedCalculation(ConcurrentHashMap<Key, FutureTask<T>> cache, Key key, Callable<T> calculation) {
try {
FutureTask<T> t = cache.computeIfAbsent(key, k -> new FutureTask<>(calculation));
t.run();
return t.get();
} catch(Exception ex) {
throw new RuntimeException(ex);
}
}
}
Как такой вариант?
FJP можно брать общий на VM (ForkJoinPool.common, или как-то так) - если нет (сильно) блокирующих элементов в вычислении, то это не должно (сильно) повредить в целом приложению Если прям параллельность в выполнении не нужна (перформанс, все дела), то вроде выглядит норм
Обсуждают сегодня