CompletableFuture в Java
Страница каталога может одновременно запрашивать цены, остатки и отзывы у разных сервисов. Пока один ответ идёт по сети, процессор не обязан простаивать: задачу можно отдать другому потоку, а в основном коде описать, что делать, когда данные придут.
Класс CompletableFuture из java.util.concurrent
представляет результат, который появится позже. Это
развитие старого Future: к нему добавили
запуск без своего ExecutorService, цепочки
колбэков и явную обработку сбоев. Тип параметра
T - то, что вернёт задача; для работы без
значения используют CompletableFuture<Void>.
В Java 27 API остаётся частью стандартной библиотеки
и хорошо сочетается с лямбдами и потоками из раздела
о Thread. Низкоуровневый поток вы создаёте
сами; здесь же описываете сценарий: запустить,
преобразовать, объединить, дождаться.
Уже завершённый результат можно получить фабрикой
completedFuture, а асинхронный расчёт
стартует отдельными методами, которые разберём
в следующем уроке:
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<String> ready =
CompletableFuture.completedFuture("ok");
System.out.println(ready.join());
CompletableFuture<String> later =
CompletableFuture.supplyAsync(() -> {
return "from pool";
});
System.out.println(later.join());
}
}
Первый объект готов сразу, второй считается в общем
пуле потоков. Метод join блокирует текущий
поток до готовности; позже посмотрим и неблокирующие
варианты.