Middle
Какво е CompletableFuture?
sobes.tech AI
Отговор от AI
CompletableFuture в Java 8+ представлява разширение на модела Future, което добавя възможности за асинхронно програмиране и композиция на задачи.
Той реализира интерфейсите CompletionStage и Future. CompletionStage определя договора за асинхронно изпълнение и композиция на изчислителни стъпки.
Основни характеристики:
- Неблокиращи операции: Позволява изпълнение на задачи асинхронно, без да блокира основния поток.
- Композиция: Предоставя богат API за свързване и обединяване на резултатите от множество асинхронни операции.
- Обработка на изключения: Вградени механизми за обработка на грешки в асинхронните потоци.
- Създаване: Може да създавате завършени, незавършени или грешни
CompletableFuture. - Зависимости: Позволява създаване на вериги от зависими задачи, където изпълнението на една зависи от завършването на друга.
- Паралелно изпълнение: Методи като
allOfиanyOfза паралелно изпълнение на няколко задачи.
Примери за използване:
-
Създаване и завършване:
// Създаване на завършен CompletableFuture CompletableFuture<String> completedFuture = CompletableFuture.completedFuture("Здравей"); // Създаване на незавършен CompletableFuture и неговото завършване по-късно CompletableFuture<String> future = new CompletableFuture<>(); // ... изпълнение на асинхронна работа ... future.complete("Готово"); // Или при грешка // future.completeExceptionally(new RuntimeException("Грешка")); -
Изпълнение на асинхронна задача:
CompletableFuture<String> asyncFuture = CompletableFuture.supplyAsync(() -> { // Асинхронна работа (например, четене от файл, мрежов заявка) try { Thread.sleep(1000); } catch (InterruptedException e) { throw new IllegalStateException(e); } return "Асинхронен резултат"; }); -
Композиция с
thenApply:CompletableFuture<Integer> result = CompletableFuture.supplyAsync(() -> 10) .thenApply(x -> x * 2); // Резултатът от предишната стъпка се предава във функция -
Композиция с
thenCombine:CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10); CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20); CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (res1, res2) -> res1 + res2); // Обединяване на резултатите от двете CompletableFuture -
Обработка на завършване с
thenAccept:CompletableFuture.supplyAsync(() -> "Краен резултат") .thenAccept(result -> System.out.println("Задачата приключи с резултат: " + result)); // Изпълнение на действие след завършване без връщане на стойност -
Обработка на изключения с
exceptionally:CompletableFuture<String> futureWithException = CompletableFuture.supplyAsync(() -> { throw new RuntimeException("Нещо се обърка"); }).exceptionally(ex -> { System.err.println("Настъпи грешка: " + ex.getMessage()); return "Стойност по подразбиране"; // Връщане на стойност по подразбиране при грешка });
CompletableFuture значително улеснява писането на асинхронен и неблокиращ код в Java, правейки го по-четим и поддържан в сравнение с традиционните callback-и или блокиращи извиквания Future.get().