Назад к вопросам
Middle
69
questionbank
Расскажите о концепции класса CompletableFuture.
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
CompletableFuture — это класс в Java 8+, реализующий интерфейсы Future и CompletionStage. Он представляет собой асинхронное вычисление, которое может быть завершено (или выдаст ошибку) в какой-то момент в будущем и над результатом которого можно выполнять последующие действия декларативно, без блокировки основного потока.
Основные возможности:
- Асинхронное выполнение: Позволяет запускать задачи в отдельном потоке (или пуле потоков).
- Композиция: Можно объединять несколько
CompletableFuture, создавая цепочки зависимых действий. - Управление исключениями: Предоставляет методы для обработки ошибок асинхронных вычислений.
- Неблокирующие операции: Результат или исключение обрабатываются, когда future завершается, без явного ожидания (
get()).
Ключевые методы:
- Создание:
supplyAsync(Supplier<T> supplier): Запускает Supplier асинхронно и возвращаетCompletableFutureс его результатом.runAsync(Runnable runnable): Запускает Runnable асинхронно и возвращаетCompletableFuture<Void>.completedFuture(T value): Создает уже завершенныйCompletableFutureс заданным значением.
- Преобразование:
thenApply(Function<T, U> fn): Применяет функцию к результату, когда future завершается.thenAccept(Consumer<T> action): Выполняет действие над результатом, когда future завершается.thenRun(Runnable action): Выполняет действие, когда future завершается, игнорируя результат.thenCompose(Function<T, CompletionStage<U>> fn): Позволяет строить цепочки, где результат одного future используется для создания другого.
- Комбинация:
thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): Объединяет результаты двух future.allOf(CompletableFuture<?>... cfs): ВозвращаетCompletableFuture<Void>, который завершается, когда все переданные future завершатся.anyOf(CompletableFuture<?>... cfs): ВозвращаетCompletableFuture<Object>, который завершается, когда любой из переданных future завершится.
- Обработка исключений:
exceptionally(Function<Throwable, T> fn): Обрабатывает исключение, возвращая альтернативное значение.handle(BiFunction<T, Throwable, U> fn): Обрабатывает как результат, так и исключение.
Пример:
// Запуск асинхронной задачи
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // Имитация долгой работы
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return "Результат асинхронной операции";
});
// Выполнение действия после завершения задачи (неблокирующе)
future.thenAccept(result -> {
System.out.println("Получен результат: " + result);
});
// Еще одно действие, которое зависит от первого
future.thenApply(String::toUpperCase)
.thenAccept(upperCaseResult -> {
System.out.println("Результат в верхнем регистре: " + upperCaseResult);
});
// Ожидание всех задач (в реальных приложениях обычно избегают явного get/join)
// future.join();
CompletableFuture является мощным инструментом для написания реактивного и неблокирующего кода в Java, значительно упрощая работу с асинхронностью по сравнению с классическим интерфейсом Future.