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

Задача, отправленная в пул через submit(), бросает RuntimeException, но в логах ничего нет. Почему?

MiddleМногопоточность
Коротко

submit() прячет исключение в Future: оно появится только при get() в ExecutionException. Если результат никто не запрашивает — ошибка исчезает бесследно. execute() пропускает исключение до UncaughtExceptionHandler, и оно попадает в лог.

  • Fire-and-forget задачи — execute или try/catch с логированием внутри
  • Можно переопределить afterExecute у ThreadPoolExecutor
  • CompletableFuture — то же: ошибку нужно обработать в exceptionally или whenComplete

А ещё Классическая причина «тихо пропавших» задач

Подробно

Это классическая причина «тихо пропавших» задач. Разница принципиальная: execute(Runnable) даёт исключению дойти до обработчика непойманных исключений потока, а submit() оборачивает задачу в FutureTask и складывает исключение внутрь — если результат никто не запрашивает, ошибка исчезает бесследно. Отсюда практика: либо всегда обрабатывать результат Future, либо ловить исключения внутри самой задачи, либо использовать execute для задач без результата. Для запланированных задач это ещё опаснее: исключение в ScheduledExecutorService отменяет все последующие запуски.

Что хотят услышать

  • Различие submit и execute.
  • Способы не потерять ошибку.

Частые ошибки

  • Считать, что достаточно настроить UncaughtExceptionHandler — при submit он не сработает.
  • Забывать, что упавшая периодическая задача больше не перезапустится.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Пул по спецификации подавляет и не логирует все исключения задач
  • ✓Исключение сохраняется в Future и всплывёт только при get()
  • ✗Исключение ушло в UncaughtExceptionHandler, который по умолчанию молчит
  • ✗RuntimeException в пуле потоков просто игнорируется, логировать нужно только checked-исключения

Что спросят дальше

  • Что произойдёт с периодической задачей при исключении?
  • Чем в этом смысле удобнее CompletableFuture?

Разбор темы

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

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

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

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

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