Ваше текущее решение вызывает supplyAsync()
немедленно и позже пытается объединить результаты.
Если вы хотите гарантировать последовательное выполнение, вы должны использовать thenApply()
или thenCompose()
вместо thenCombine()
:
for (Supplier<Boolean> method : methods)
{
if (future == null)
{
future = CompletableFuture.supplyAsync(method, threadPool);
}
else
{
future.thenApplyAsync(result -> result && method.get(), threadPool);
}
}
Обратите внимание, что это не вызовет method.get()
у следующих поставщиков, если любой из них вернет false, поскольку &&
имеет короткое замыкание.Вы можете в любом случае использовать один &
для принудительного вызова или поменять местами параметры.
Это уже объединяет все логические результаты в конце.Вы можете добавить что-нибудь к результирующему future
после цикла, например, дополнительные вызовы thenApply()
или блокирующий вызов join()
для получения Boolean
.
Обратите внимание, что этот цикл также можно легко переписатьиспользуя потоки:
future = Arrays.stream(methods)
.reduce(CompletableFuture.completedFuture(true),
(f, method) -> f.thenApplyAsync(result -> result && method.get()),
(f1, f2) -> f1.thenCombine(f2, (result1, result2) -> result1 && result2));