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

Что такое CompletableFuture?

Sobes Copilot

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

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

sobes.tech AI

CompletableFuture в Java 8+ представляет собой расширение модели Future, добавляющее возможности асинхронного программирования и композиции задач.

Он реализует интерфейсы CompletionStage и Future. CompletionStage определяет контракт для асинхронного выполнения и композиции вычислительных шагов.

Ключевые особенности:

  • Неблокирующие операции: Позволяет выполнять задачи асинхронно, не блокируя основной поток выполнения.
  • Композиция: Предоставляет ricco API для связывания и объединения результатов множества асинхронных операций.
  • Обработка исключений: Встроенные механизмы для обработки ошибок в асинхронных потоках.
  • Создание: Можно создавать завершенные, незавершенные или ошибочные CompletableFuture.
  • Зависимости: Позволяет создавать цепочки зависимых задач, где выполнение одной зависит от завершения другой.
  • Параллельное выполнение: Методы типа allOf и anyOf для параллельного выполнения нескольких задач.

Примеры использования:

  1. Создание и завершение:

    // Создание завершенного CompletableFuture
    CompletableFuture<String> completedFuture = CompletableFuture.completedFuture("Hello");
    
    // Создание незавершенного CompletableFuture и его завершение позже
    CompletableFuture<String> future = new CompletableFuture<>();
    // ... выполнение асинхронной работы ...
    future.complete("Done");
    // Или при ошибке
    // future.completeExceptionally(new RuntimeException("Error"));
    
  2. Выполнение асинхронной задачи:

    CompletableFuture<String> asyncFuture = CompletableFuture.supplyAsync(() -> {
        // Асинхронная работа (например, чтение из файла, сетевой запрос)
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
        return "Async Result";
    });
    
  3. Композиция с thenApply:

    CompletableFuture<Integer> result = CompletableFuture.supplyAsync(() -> 10)
        .thenApply(x -> x * 2); // Результат предыдущего шага передается в функцию
    
  4. Композиция с thenCombine:

    CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10입니다);
    CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20);
    
    CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (res1, res2) -> res1 + res2); // Объединение результатов двух CompletableFuture
    
  5. Обработка завершения с thenAccept:

    CompletableFuture.supplyAsync(() -> "Final result")
        .thenAccept(result -> System.out.println("Task finished with result: " + result)); // Выполнение действия после завершения без возврата значения
    
  6. Обработка исключений с exceptionally:

    CompletableFuture<String> futureWithException = CompletableFuture.supplyAsync(() -> {
        throw new RuntimeException("Something went wrong");
    }).exceptionally(ex -> {
        System.err.println("Error occurred: " + ex.getMessage());
        return "Default Value"; // Возврат значения по умолчанию при ошибке
    });
    

CompletableFuture значительно упрощает написание Asynchronous и неблокирующего кода в Java, делая его более читаемым и поддерживаемым по сравнению с традиционными колбэками или блокирующими вызовами Future.get().