#java #scheduler
Вопрос:
Я использую ScheduledExecutorService
метод, при котором время от времени задача может выполняться в течение 3 часов pollMergeFiles.searchForFileAndExecute()
, а иногда для ее выполнения может потребоваться менее 2 минут.
Мой единственный вопрос заключается в том, будет ли scheduler.scheduleAtFixedRate
в конечном итоге выполняться каждые 10 минут с задержкой в 5 минут или он будет ждать завершения выполнения предыдущей задачи и только затем начнет новую задачу?
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
...
PollMergeFiles pollMergeFiles = new PollMergeFiles();
final Runnable service = new Runnable() {
public void run() {
try {
if (counter <= 256) {
pollMergeFiles.searchForFileAndExecute();
} else if (counter > 256) {
logger.info(
"Shutdown the scheduler service since all counters were processed");
scheduler.shutdown();
}
} catch (Exception e) {
logger.error("Exception found", e);
}
}
};
scheduler.scheduleAtFixedRate(service, 5, 10, TimeUnit.Minutes);
Комментарии:
1. scheduleAtFixedRate будет запускать новую задачу каждые 10 минут, scheduleWithFixedDelay начнет новую задачу через 10 минут после завершения предыдущей.
2. Спасибо @DDovzhenko
Ответ №1:
Вы можете проверить документ Java https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html .
scheduleAtFixedRate(выполняемая команда, длительный начальный цикл, длительный период, единица измерения времени) Создает и выполняет периодическое действие, которое включается сначала после заданной начальной задержки, а затем с заданным периодом; то есть выполнение начнется после initialDelay, затем initialDelay период, затем initialDelay 2 * период и так далее.
Таким образом, функция scheduleAtFixedRate() не будет ждать завершения последней задачи. Он будет выполняться с заданным интервалом (поле период).
scheduleWithFixedDelay(выполняемая команда, длительное начальное время, длительная задержка, единица измерения времени) Создает и выполняет периодическое действие, которое включается сначала после заданной начальной задержки, а затем с заданной задержкой между завершением одного выполнения и началом следующего.
Но метод scheduleWithFixedDelay() может ждать заданного времени (поле задержки) после выполнения последней задачи.