Выбор ответа Senior java.util.concurrent и виртуальные потоки обновлено

В каком потоке выполнится thenApply

Вопрос

В каком потоке выполнится функция в future.thenApply(f) (без суффикса Async)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: В потоке, завершившем future, или в вызывающем, если он уже готов. Не-async стадии выполняются «там, где получится»: если источник ещё не завершён, колбэк выполнит поток, который его завершит; если уже завершён, колбэк выполнится сразу в текущем потоке.

Варианты ответа

  1. Всегда в ForkJoinPool.commonPool(), как и у async-версии
  2. В потоке, завершившем future, или в вызывающем, если он уже готовправильный ответ
  3. Всегда в том потоке, который вызвал thenApply, сразу при вызове
  4. В новом отдельном потоке, который создаётся для каждой стадии цепочки

Разбор

Не-async стадии выполняются «там, где получится»: если источник ещё не завершён, колбэк выполнит поток, который его завершит; если уже завершён, колбэк выполнится сразу в текущем потоке. Поэтому тяжёлая работа в thenApply может неожиданно занять поток Netty или поток HTTP-клиента. Для контроля используют thenApplyAsync(f, executor).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме