Метод allOf
Метод allOf класса CompletableFuture принимает
переменное число фьючерсов (или массив) типа
CompletableFuture<?> и возвращает новый
CompletableFuture<Void>. Полученный фьючерс
завершается только тогда, когда завершатся все переданные
фьючерсы. При этом сам результат работы метода не содержит
значения - это просто маркер, сигнализирующий о том, что
вся группа задач выполнена. Если хотя бы один из переданных
фьючерсов завершится с ошибкой, итоговый фьючерс также
завершится с ошибкой (CompletionException).
В первый параметр (varargs) мы передаем набор фьючерсов,
объединяемых в группу.
Метод удобен, когда нужно дождаться выполнения нескольких
асинхронных операций, а затем продолжить работу. Так как
результат имеет тип Void, для получения значений
отдельных фьючерсов используется метод join или
get уже после завершения общего фьючерса.
Синтаксис
CompletableFuture.allOf(CompletableFuture<?>... cfs)
Пример
Давайте создадим три асинхронных задачи и объединим их
с помощью allOf, а затем выведем результаты каждой
из них после завершения всей группы:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() -> "abcde");
CompletableFuture<String> f2 = CompletableFuture.supplyAsync(() -> "12345");
CompletableFuture<String> f3 = CompletableFuture.supplyAsync(() -> "hello");
CompletableFuture<Void> all = CompletableFuture.allOf(f1, f2, f3);
all.join();
System.out.println(f1.join());
System.out.println(f2.join());
System.out.println(f3.join());
}
}
Результат выполнения кода:
"abcde"
"12345"
"hello"
Пример
Давайте дождемся завершения группы фьючерсов и затем
выполним действие через thenRun:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<Integer> f1 = CompletableFuture.supplyAsync(() -> 1);
CompletableFuture<Integer> f2 = CompletableFuture.supplyAsync(() -> 2);
CompletableFuture<Integer> f3 = CompletableFuture.supplyAsync(() -> 3);
CompletableFuture<Void> all = CompletableFuture.allOf(f1, f2, f3);
all.thenRun(() -> System.out.println("all done")).join();
}
}
Результат выполнения кода:
"all done"
Пример
Давайте посмотрим, что произойдет, если одна из задач завершится с ошибкой:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() -> "abcde");
CompletableFuture<String> f2 = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("fail");
});
CompletableFuture<Void> all = CompletableFuture.allOf(f1, f2);
try
{
all.join();
}
catch (Exception e)
{
System.out.println("exception caught");
}
}
}
Результат выполнения кода:
"exception caught"
Смотрите также
-
класс
CompletableFuture,
который представляет асинхронный результат -
метод
anyOf,
который завершается при завершении любого фьючерса -
метод
thenRun,
который выполняет действие после завершения -
метод
join,
который ожидает завершения фьючерса