РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1081 of 1163 menu

Метод 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,
    который ожидает завершения фьючерса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить