Ответ
Пример: Глубокое изучение CompletableFuture в Java для асинхронного и неблокирующего программирования.
Что было изучено:
- Комбинирование асинхронных задач без блокирующего ожидания.
- Обработка исключений в цепочках вызовов.
- Запуск задач с пользовательским
ExecutorServiceдля контроля над потоками.
Практический пример — параллельное выполнение и комбинирование результатов:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executors;
// Асинхронно получаем данные из двух независимых источников
CompletableFuture<Integer> fetchUserScore = CompletableFuture
.supplyAsync(() -> userService.calculateScore(userId));
CompletableFuture<Integer> fetchProductRating = CompletableFuture
.supplyAsync(() -> productService.getAverageRating(productId),
Executors.newFixedThreadPool(2)); // Кастомный пул
// Комбинируем результаты, когда оба future завершатся
CompletableFuture<Double> combinedResult = fetchUserScore
.thenCombine(fetchProductRating, (score, rating) -> {
// Логика объединения данных
return score * 0.7 + rating * 0.3;
});
// Обрабатываем результат или исключение
combinedResult
.thenAccept(finalScore -> System.out.println("Final score: " + finalScore))
.exceptionally(ex -> {
System.err.println("Calculation failed: " + ex.getMessage());
return null;
});
Ключевые преимущества:
- Производительность: Параллельное выполнение независимых IO-операций.
- Читаемость: Четкая цепочка вызовов вместо "callback hell".
- Гибкость: Методы
allOf(),anyOf(),handle(),thenCompose()для сложных сценариев.