Sobes.tech
Middle

Какво е CompletableFuture?

sobes.tech AI

Отговор от AI

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

Той реализира интерфейсите CompletionStage и Future. CompletionStage определя договора за асинхронно изпълнение и композиция на изчислителни стъпки.

Основни характеристики:

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

Примери за използване:

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

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

    CompletableFuture<String> asyncFuture = CompletableFuture.supplyAsync(() -> {
        // Асинхронна работа (например, четене от файл, мрежов заявка)
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
        return "Асинхронен резултат";
    });
    
  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(() -> "Краен резултат")
        .thenAccept(result -> System.out.println("Задачата приключи с резултат: " + result)); // Изпълнение на действие след завършване без връщане на стойност
    
  6. Обработка на изключения с exceptionally:

    CompletableFuture<String> futureWithException = CompletableFuture.supplyAsync(() -> {
        throw new RuntimeException("Нещо се обърка");
    }).exceptionally(ex -> {
        System.err.println("Настъпи грешка: " + ex.getMessage());
        return "Стойност по подразбиране"; // Връщане на стойност по подразбиране при грешка
    });
    

CompletableFuture значително улеснява писането на асинхронен и неблокиращ код в Java, правейки го по-четим и поддържан в сравнение с традиционните callback-и или блокиращи извиквания Future.get().