Задача, отправленная в пул через submit(), бросает RuntimeException, но в логах ничего нет. Почему?
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?
Разбор темы
- Пулы потоков и ExecutorService
Зачем пул, параметры ThreadPoolExecutor, ловушки фабрик Executors, выбор размера и корректное завершение.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.