0

У меня есть приложение, которое использует ScheduledExecutorService для обработки нескольких Runnable: каждый из них запланирован с фиксированной ставкой, а должен быть живым до тех пор, пока приложение.Проверить статус запланированных задач

Мне нужно решение для уведомления, если какой-либо из этих потоков завершен за какое-то исключение, поэтому я могу запланировать их снова.

Могу ли я использовать любой шаблон для решения этой проблемы? Или я использую неправильные объекты в своем приложении?

+0

http://stackoverflow.com/questions/21442322/scheduledexecutorservice-check-if-scheduled-task-has-already-been-completed –

ответ

0

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

class CatchingRunnable implements Runnable { 
    private final Runnable delegate; 

    CatchingRunnable(Runnable delegate) { 
    this.delegate = delegate; 
    } 

    @Override public void run() { 
    try { 
     delegate.run(); 
    } catch (RuntimeException e) { 
     // Handle the exception somehow, e.g. log it. 
    } 
    } 
} 

Теперь расписание runnable через:

executor.scheduleAtFixedRate(new CatchingRunnable(runnable), delay, period, unit); 

Тогда вам не нужно беспокоиться о перепланировке их.

+0

Это хорошо, но может быть сложно предсказать любое исключение, которое вы можете имеют и обрабатывают его соответственно. Предложение: из блока '' 'catch''', обращайтесь к классу, у которого есть исполнитель, и перепланируйте. Для этого у вас, вероятно, будет другой интерфейс вместо '' 'Runnable''' для' '' delegate''', который также имеет функцию (например, '' 'rereate()' '') для воссоздания одного и того же делегата , –

+0

@JornVernee хорошо, конечно, вы, возможно, захотите обработать определенные исключения определенными способами. Но 1) как бы вы справились с этими «непознаваемыми» исключениями другими способами? 2) Если ваша цель - «если она не удалась, перезапустите ее», тип исключения не имеет значения. –

+0

Да, моя точка была номером 2, тип исключения не имеет значения. Предполагалось, что runnable перенести сам, если он завершится с исключением. Вот и все. –

0

Вы также можете сохранить обработчик для повторной отправки, если ScheduleFuture завершается.

Смежные вопросы