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

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

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

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

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

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

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