ScheduledExecutorService будет выполняться независимо от статуса завершения предыдущей задачи

#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() может ждать заданного времени (поле задержки) после выполнения последней задачи.