CompletableFuture — как выполнять задачи асинхронно в Java?
Если Thread позволяет запустить код в отдельном потоке, то CompletableFuture позволяет удобно строить цепочки асинхронных операций.
Например:
Здесь сначала асинхронно получаем пользователя, затем преобразуем результат и передаём его следующему обработчику.
Можно обрабатывать ошибки:
Можно запустить несколько независимых задач параллельно:
CompletableFuture также позволяет дождаться выполнения нескольких задач:
Важно: CompletableFuture — это не отдельный механизм создания потоков. По умолчанию supplyAsync() использует общий ForkJoinPool. При необходимости можно передать собственный Executor.
Главная идея: CompletableFuture удобен, когда нужно строить сложные цепочки асинхронных операций, комбинировать результаты и централизованно обрабатывать ошибки.
Если Thread позволяет запустить код в отдельном потоке, то CompletableFuture позволяет удобно строить цепочки асинхронных операций.
Например:
CompletableFuture
.supplyAsync(() -> getUser())
.thenApply(user -> user.getName())
.thenAccept(System.out::println);
Здесь сначала асинхронно получаем пользователя, затем преобразуем результат и передаём его следующему обработчику.
Можно обрабатывать ошибки:
CompletableFuture
.supplyAsync(() -> getUser())
.thenApply(User::getName)
.exceptionally(ex -> "Unknown");
Можно запустить несколько независимых задач параллельно:
var user = getUserAsync();
var orders = getOrdersAsync();
user.thenCombine(orders, (u, o) -> new UserOrders(u, o));
CompletableFuture также позволяет дождаться выполнения нескольких задач:
CompletableFuture.allOf(user, orders).join();
Важно: CompletableFuture — это не отдельный механизм создания потоков. По умолчанию supplyAsync() использует общий ForkJoinPool. При необходимости можно передать собственный Executor.
Главная идея: CompletableFuture удобен, когда нужно строить сложные цепочки асинхронных операций, комбинировать результаты и централизованно обрабатывать ошибки.
Просмотры: 13