Необработанные исключения с Java запланировали исполнителей

Вы используете рычаги постфиксации . Вот руководство .

Вот демонстрационный сценарий Ruby, который посылает электронное письмо после каждой фиксации: фиксация-email.rb

30
задан Pablo Santa Cruz 2 November 2009 в 11:48
поделиться

3 ответа

Документация Javadoc для scheduleAtFixedRate и scheduleWithFixedDelay сообщает: «Если при выполнении задачи возникает исключение , последующие казни подавляются ". Я не нахожу это совершенно ясным, но похоже, что если ваш метод run выдает какое-либо исключение, то планировщик эффективно отбрасывает эту задачу. Никакие другие задачи, выполняемые через этот планировщик, не должны быть затронуты. Проверить, что он делает на самом деле, не составит труда ...

Отмена задания не обязательно плохо. Если метод run генерирует исключение RuntimeException , вероятно, где-то есть ошибка, и состояние системы неизвестно. Но, как минимум, я бы посоветовал перехватить RuntimeException в вашем методе запуска и записать полную трассировку стека в SEVERE. В зависимости от обстоятельств вы можете затем выполнить повторное создание, чтобы отменить задачу. Но в любом случае вам понадобится регистрация, чтобы иметь шанс выяснить, что пошло не так.

29
ответ дан 28 November 2019 в 00:09
поделиться

Если вы используете scheduleAtFixedRate () или scheduleAtFixedDelay () , и ваша задача завершается с исключением, эта задача не будет перенесена. Однако другие независимые задачи должны продолжать выполняться, как ожидалось. (См. Документы API ). Если вам небезразлично, что это произошло, вы можете захватить возвращаемый ScheduledFuture и вызвать метод get () . Если основная задача выбрасывает исключение, вы получите его из метода get () , заключенного в исключение ExecutionException .

12
ответ дан 28 November 2019 в 00:09
поделиться

Похоже, API не определяет какой-либо конкретный механизм обработки исключений. Т.е. неперехваченное исключение просто появляется через кадры потока и в конечном итоге регистрируется в stderr.

Я вижу, что вы можете использовать следующие стратегии обработки исключений:

  • определить обработчик в классе задачи, объекты которой отправляются в пул потоков. ;
  • предоставить собственную реализацию ThreadFactory для пула потоков, которая инициализирует обработчик по умолчанию с помощью setUncaughtExceptionHandler () или ThreadGroup uncaughtException () ;
-2
ответ дан 28 November 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: