У меня есть запланированная задача (работающий в фиксированном выполнении задержки), запущенный как это:
executoreService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS);
На каждом запуске цикла я проверяю для разнообразия в файл настроек, и затем я хочу перезапустить задачу. Файл настроек также содержит длину интервала (numOfSeconds
в вышеупомянутом коде).
В настоящее время я использую следующий код для перезапуска задачи:
executoreService.shutdownNow();
try {
while(!executoreService.awaitTermination(5, TimeUnit.SECONDS)){
logger.debug("awaiting termintation");
}
} catch (InterruptedException e) {
logger.debug("interrupted, continuing", e);
}
// initialize startup parameters
init();
// start the main scheduled timer
executoreService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS);
Я не уверен в этих вызовах API. Что рекомендуемый путь состоит в том, чтобы перезапустить задачу (возможно с новой задержкой)?
Нет, вы не хотите или не должны отключать всю службу только для изменения одной задачи. Вместо этого используйте объект ScheduledFuture, который вы получаете от службы, чтобы отменить задачу, а затем запланировать новую.
ScheduledFuture<?> future = executorService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS);
...
// to cancel it:
future.cancel(true);
// then schedule again
В качестве альтернативы, почему бы просто не обновить состояние в любом повторяющемся потоке с новыми настройками или параметрами? его даже не нужно переносить, если вам не нужна новая отсрочка.