Вопрос с собеседования · Java

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования