Это имеет мало общего с "потоками".Логика повторных попыток может быть реализована для исключений, и это обычная практика.
Тем не менее, перехват Throwable
явно опасен.Вы хотели бы повторить попытку при ошибках выбора (таких как тайм-аут, сбой соединения и т. Д.), Что, конечно, требует более точных знаний о том, как работает ваш метод runJob()
.
Кроме того, ваша реализация повторных попыток делает рекурсивный вызов, который также может быть плохим.Вы в конечном итоге столкнетесь с ошибкой переполнения стека (а также catch
с вашим Throwbale
блоком catch, что в целом приведет к странному поведению).Вместо этого выполните цикл и выполните runJob()
несколько раз.
boolean retry = false;
do {
try {
runJob();
retry = false;
} catch (SpecificException e) { //timeout, network failure exceptions
logger.error("Exception in running thread: "
+ this.getName() + ", restarting job");
retry = true;
}
} while(retry);
Вам также может понадобиться добавить счетчик, чтобы ограничить количество повторных попыток.