Рассмотрите, что я запланировал Runnable для периодического выполнения с помощью ScheduledExecutorService и возникает некоторая системная ошибка, например OutOfMemory. Он будет молча проглочен.ScheduledExecutorService throwable lost
scheduler.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
throw new OutOfMemoryError(); // Swallowed
}
}, 0, delay, TimeUnit.SECONDS);
Нормально ли это?
Почему он не распространяется на контейнер?
Каков правильный способ обработки таких ошибок?
Спасибо!
Итак, вы советуете всегда вызывать future.get() после планирования повторяемой задачи? Но это вызовет создание спальных нитей. Это нормально? –
Ну, вы не можете знать, выбрала ли ваша работа исключение или нет до тех пор, пока оно не будет завершено, поэтому вам придется подождать, пока он завершится успешно или не сработает (выбросьте исключение или ошибку).Если вы вызываете get с тайм-аутом 0, метод будет вызывать исключение TimeoutException, если задание все еще выполняется. Вам не нужно блокировать поток, чтобы запросить статус возвращенного Будущего. – jarnbjo