Короткий ответ
CompletableFuture — класс из пакета java.util.concurrent, появившийся в Java 8 и реализующий интерфейсы Future и CompletionStage. Он представляет результат асинхронной операции и позволяет писать асинхронный, событийно-ориентированный код: строить цепочки зависимых шагов, обрабатывать ошибки и комбинировать несколько операций без блокировки потока.
Как это работает подробнее
Классический Future ограничен: результат получается только блокирующим вызовом get(), future нельзя завершить вручную, несколько future нельзя соединить в цепочку или скомбинировать, а исключения обрабатывать неудобно.
CompletableFuture можно завершить явно методом complete(value) или завершить с ошибкой через completeExceptionally(). Задачи запускаются статическими фабриками runAsync() (без результата) и supplyAsync() (с результатом).
- Конвейер шагов:
thenApply()преобразует результат,thenAccept()потребляет его,thenCompose()соединяет future-операции, аexceptionally()/handle()обрабатывают ошибки. - Несколько независимых future объединяются методами
thenCombine(),allOf(),anyOf(); колбэки выполняются по мере готовности результатов.
Пример кода
import java.util.concurrent.CompletableFuture;
public class CompletableFutureDemo {
static String fetchUserId() { return "u42"; }
static String loadUser(String id) { return "user-" + id; }
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> fetchUserId())
.thenApply(id -> loadUser(id)) // зависимое преобразование
.thenAccept(user -> System.out.println(user))
.exceptionally(ex -> {
System.err.println("Ошибка: " + ex.getMessage());
return null;
})
.join(); // блокируемся только в конце, если нужно дождаться
}
}