Назад к вопросам
Middle
116
questionbank
Для чего предназначены классы Future и CompletableFuture в Java?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Future представляет результат асинхронной операции, который будет доступен в будущем. Он позволяет проверить статус выполнения, дождаться завершения и получить результат или выбросить исключение.
CompletableFuture расширяет возможности Future, добавляя возможность связывать последовательные и параллельные асинхронные операции, выполнять действия по завершении задачи, обрабатывать исключения и объединять результаты. Он реализует интерфейс CompletionStage.
Основные отличия CompletableFuture от Future:
- Чейнинг (Chaining): Возможность связывать асинхронные операции.
- Композиция: Объединение результатов нескольких
CompletableFuture. - Обработка исключений: Более гибкие механизмы обработки ошибок.
- Программное завершение: Возможность завершить
CompletableFutureвручную.
Пример использования Future:
import java.util.concurrent.*;
// ...
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> {
Thread.sleep(1000); // имитация долгой работы
return "Результат операции Future";
});
try {
String result = future.get(); // блокирующее получение результата
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}
Пример использования CompletableFuture:
import java.util.concurrent.*;
// ...
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return "Результат первой операции";
});
CompletableFuture<String> secondFuture = future.thenApplyAsync(result -> {
System.out.println("Получен результат: " + result);
return result + ", результат второй операции";
});
secondFuture.thenAccept(finalResult -> {
System.out.println("Финальный результат: " + finalResult);
});
// Для демонстрации, в реальном приложении используются другие механизмы ожидания или завершения
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}