Что представляет собой объект Future?
- Чем Future отличается от CompletableFuture?
- Как получить результат задачи из другого потока?
Future — ссылка на результат, который появится позже: можно проверить готовность, дождаться значения или отменить задачу.
- get() блокирует вызывающий поток до готовности — лучше с таймаутом
- Исключение задачи всплывает в get() как ExecutionException
А ещё Для цепочек и неблокирующей обработки — CompletableFuture: thenApply, thenCombine, exceptionally
Подробно
Когда задача отправлена в пул через submit, сразу возвращается Future<T>. Вызывающий поток продолжает работу, а за результатом обращается, когда он нужен.
Методы:
get()— дождаться результата, блокируя поток;get(timeout, unit)— с ограничением по времени;isDone()— готов ли результат;cancel(mayInterrupt)— отменить задачу.
Если задача упала, исключение не теряется: get() бросит ExecutionException, а причина — в getCause().
Ограничения базового Future: получить результат можно только блокирующим ожиданием, объединять несколько задач и описывать «что делать после» неудобно.
CompletableFuture (Java 8) решает это: цепочки преобразований (thenApply, thenCompose), объединение (thenCombine, allOf), обработка ошибок (exceptionally, handle) — без блокировки. По умолчанию асинхронные этапы выполняются в общем пуле ForkJoinPool; для задач с ожиданием I/O лучше передать свой executor.
Пример
CompletableFuture<User> user = CompletableFuture.supplyAsync(() -> loadUser(id), ioPool);
CompletableFuture<List<Order>> orders = CompletableFuture.supplyAsync(() -> loadOrders(id), ioPool);
CompletableFuture<Profile> profile = user.thenCombine(orders, Profile::new)
.exceptionally(e -> Profile.empty());Что хотят услышать
- Future как обещание результата.
- Блокирующий get(), таймаут, ExecutionException.
- Ограничения Future и чем помогает CompletableFuture.
Частые ошибки
- Запрашивать результат сразу после отправки задачи и терять всю параллельность.
- Забывать про таймаут при ожидании результата.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Копию задачи для повторного выполнения
- ✗Поток, в котором выполняется задача и хранится её результат
- ✗Очередь задач, ожидающих выполнения
- ✓Ссылку на будущий результат задачи
Что спросят дальше
- Какие ограничения снимает CompletableFuture?
- Что произойдёт с исключением, брошенным внутри задачи?
Разбор темы
- Future и CompletableFuture
Ограничения Future, асинхронная композиция CompletableFuture, async-варианты с пулами и обработка ошибок.
Связанные вопросы
- Чем различаются exceptionally, handle и whenComplete у CompletableFuture? Middle
- Какое ограничение Future решает CompletableFuture? Middle
- Почему опасно выполнять блокирующие операции в стадиях CompletableFuture без явного Executor? Senior
- Чем thenCompose отличается от thenApply в CompletableFuture? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.