Что корректный путь состоит в том, чтобы перезапустить запланированную задачу ScheduledExecutorService?

У меня есть запланированная задача (работающий в фиксированном выполнении задержки), запущенный как это:

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. Что рекомендуемый путь состоит в том, чтобы перезапустить задачу (возможно с новой задержкой)?

12
задан Ovesh 16 February 2010 в 09:57
поделиться

1 ответ

Нет, вы не хотите или не должны отключать всю службу только для изменения одной задачи. Вместо этого используйте объект ScheduledFuture, который вы получаете от службы, чтобы отменить задачу, а затем запланировать новую.

ScheduledFuture<?> future = executorService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS);
...
// to cancel it:
future.cancel(true);
// then schedule again

В качестве альтернативы, почему бы просто не обновить состояние в любом повторяющемся потоке с новыми настройками или параметрами? его даже не нужно переносить, если вам не нужна новая отсрочка.

18
ответ дан 2 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

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