Получить доступ

Что представляет собой объект Future?

JuniorМногопоточность
Ещё спрашивают так:
  • Чем Future отличается от CompletableFuture?
  • Как получить результат задачи из другого потока?
Коротко

Future — ссылка на результат, который появится позже: можно проверить готовность, дождаться значения или отменить задачу.

  • get() блокирует вызывающий поток до готовности — лучше с таймаутом
  • Исключение задачи всплывает в get() как ExecutionException

А ещё Для цепочек и неблокирующей обработки — CompletableFuture: thenApply, thenCombine, exceptionally

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Когда задача отправлена в пул через 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?
  • Что произойдёт с исключением, брошенным внутри задачи?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем