Назад к вопросам
Middle
69
questionbank

Расскажите о концепции класса CompletableFuture.

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

CompletableFuture — это класс в Java 8+, реализующий интерфейсы Future и CompletionStage. Он представляет собой асинхронное вычисление, которое может быть завершено (или выдаст ошибку) в какой-то момент в будущем и над результатом которого можно выполнять последующие действия декларативно, без блокировки основного потока.

Основные возможности:

  • Асинхронное выполнение: Позволяет запускать задачи в отдельном потоке (или пуле потоков).
  • Композиция: Можно объединять несколько CompletableFuture, создавая цепочки зависимых действий.
  • Управление исключениями: Предоставляет методы для обработки ошибок асинхронных вычислений.
  • Неблокирующие операции: Результат или исключение обрабатываются, когда future завершается, без явного ожидания (get()).

Ключевые методы:

  • Создание:
    • supplyAsync(Supplier<T> supplier): Запускает Supplier асинхронно и возвращает CompletableFuture с его результатом.
    • runAsync(Runnable runnable): Запускает Runnable асинхронно и возвращает CompletableFuture<Void>.
    • completedFuture(T value): Создает уже завершенный CompletableFuture с заданным значением.
  • Преобразование:
    • thenApply(Function<T, U> fn): Применяет функцию к результату, когда future завершается.
    • thenAccept(Consumer<T> action): Выполняет действие над результатом, когда future завершается.
    • thenRun(Runnable action): Выполняет действие, когда future завершается, игнорируя результат.
    • thenCompose(Function<T, CompletionStage<U>> fn): Позволяет строить цепочки, где результат одного future используется для создания другого.
  • Комбинация:
    • thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): Объединяет результаты двух future.
    • allOf(CompletableFuture<?>... cfs): Возвращает CompletableFuture<Void>, который завершается, когда все переданные future завершатся.
    • anyOf(CompletableFuture<?>... cfs): Возвращает CompletableFuture<Object>, который завершается, когда любой из переданных future завершится.
  • Обработка исключений:
    • exceptionally(Function<Throwable, T> fn): Обрабатывает исключение, возвращая альтернативное значение.
    • handle(BiFunction<T, Throwable, U> fn): Обрабатывает как результат, так и исключение.

Пример:

// Запуск асинхронной задачи
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(1000); // Имитация долгой работы
    } catch (InterruptedException e) {
        throw new IllegalStateException(e);
    }
    return "Результат асинхронной операции";
});

// Выполнение действия после завершения задачи (неблокирующе)
future.thenAccept(result -> {
    System.out.println("Получен результат: " + result);
});

// Еще одно действие, которое зависит от первого
future.thenApply(String::toUpperCase)
      .thenAccept(upperCaseResult -> {
          System.out.println("Результат в верхнем регистре: " + upperCaseResult);
      });

// Ожидание всех задач (в реальных приложениях обычно избегают явного get/join)
// future.join();

CompletableFuture является мощным инструментом для написания реактивного и неблокирующего кода в Java, значительно упрощая работу с асинхронностью по сравнению с классическим интерфейсом Future.