Что такое CompletableFuture?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
CompletableFuture в Java 8+ представляет собой расширение модели Future, добавляющее возможности асинхронного программирования и композиции задач.
Он реализует интерфейсы CompletionStage и Future. CompletionStage определяет контракт для асинхронного выполнения и композиции вычислительных шагов.
Ключевые особенности:
- Неблокирующие операции: Позволяет выполнять задачи асинхронно, не блокируя основной поток выполнения.
- Композиция: Предоставляет ricco API для связывания и объединения результатов множества асинхронных операций.
- Обработка исключений: Встроенные механизмы для обработки ошибок в асинхронных потоках.
- Создание: Можно создавать завершенные, незавершенные или ошибочные
CompletableFuture. - Зависимости: Позволяет создавать цепочки зависимых задач, где выполнение одной зависит от завершения другой.
- Параллельное выполнение: Методы типа
allOfиanyOfдля параллельного выполнения нескольких задач.
Примеры использования:
-
Создание и завершение:
// Создание завершенного CompletableFuture CompletableFuture<String> completedFuture = CompletableFuture.completedFuture("Hello"); // Создание незавершенного CompletableFuture и его завершение позже CompletableFuture<String> future = new CompletableFuture<>(); // ... выполнение асинхронной работы ... future.complete("Done"); // Или при ошибке // future.completeExceptionally(new RuntimeException("Error")); -
Выполнение асинхронной задачи:
CompletableFuture<String> asyncFuture = CompletableFuture.supplyAsync(() -> { // Асинхронная работа (например, чтение из файла, сетевой запрос) try { Thread.sleep(1000); } catch (InterruptedException e) { throw new IllegalStateException(e); } return "Async Result"; }); -
Композиция с
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(() -> "Final result") .thenAccept(result -> System.out.println("Task finished with result: " + result)); // Выполнение действия после завершения без возврата значения -
Обработка исключений с
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().