JavaRush /Курсы /Модуль 2. Java Core /Scheduled Thread Executor

Scheduled Thread Executor

Модуль 2. Java Core
14 уровень , 5 лекция
Открыта

Еще один тип пула потоков — пул запланированных задач. Судя по названию, можно предположить, что мы используем данный тип для планирования запуска той или иной задачи, распределенного во времени.

Этот вид сервиса полезен, когда у нас есть задача запуска той или иной активности с условием истечения некоторого времени или периодичности выполнения задачи.

Для использования мы вызываем Executors.newScheduledThreadPool(1).

О параметрах поговорим чуть позже, сейчас нам важно понимать, что при вызове этого метода нам возвращается объект типа ScheduledExecutorService.

ScheduledExecutorService — это интерфейс, унаследованный от ExecutorService.

В этом интерфейсе появляются следующие методы:

Метод Пояснение

ScheduledFuture<?>
schedule(Runnable command,
                                  long delay, TimeUnit unit);
Создает и выполняет однократное действие, которое выполняется после заданной задержки.

<V> ScheduledFuture<V>
schedule(Callable<V> callable,
                                      long delay, TimeUnit unit);
Создает и выполняет объект ScheduledFuture, который выполняется после заданной задержки.

ScheduledFuture<?>
scheduleAtFixedRate(Runnable command,
                                             long initialDelay,
                                             long period,
                                             TimeUnit unit);
Создает и выполняет периодическое действие, которое выполняется вначале после заданной начальной задержки, а затем с заданным периодом; то есть выполнение начнется после initialDelay, затем initialDelay+period, theninitialDelay + 2 * period и так далее.

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                long initialDelay,
                                                long delay,
                                                TimeUnit unit);
Создает и выполняет периодическое действие, которое выполняется сначала после данной первоначальной задержки, а затем с заданной задержкой между завершением одного выполнения и началом следующего.

Как мы видим, интерфейс нам предоставляет возможность запуска задач с периодичностью или спустя какое-то время.

Далее о методе newScheduledThreadPool.

Вызвать мы его можем несколькими способами:


newScheduledThreadPool(int corePoolSize)
corePoolSize — количество потоков, которые нужно хранить в пуле, даже если они простаивают.

newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

corePoolSize количество потоков, которые нужно хранить в пуле, даже если они простаивают.

threadFactory — фабрика, используемая при создании новых потоков.

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

Давайте рассмотрим работу ScheduledThreadPool на примере.

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

У нас есть класс задачи, который моделирует проверку почты.


public class Task implements Runnable {
   @Override
   public void run() {
       System.out.println("Проверяем почту...");
   }
}

Далее мы создаем пул потоков и задаем расписание для выполнения проверки.


ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
executorService.scheduleAtFixedRate(new Task(), 0, 5, TimeUnit.SECONDS);

В выводе мы видим каждые 5 секунд:

Проверяем почту...

В целом, такой пул, как и в примере, мы можем использовать для выполнения “сервисных” периодических задач. Сервисными мы называем те задачи, которые должны быть выполнены вне зависимости от работы основного функционала программы.

Комментарии (7)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Мая Уровень 82
31 июля 2025
по моему мнению, инфа от ИИ гугл понятней: The ScheduledThreadPoolExecutor in Java provides methods for scheduling tasks to run after a delay or periodically. It extends ThreadPoolExecutor and implements ScheduledExecutorService. Here are the key methods: schedule(Runnable command, long delay, TimeUnit unit): Schedules a one-shot task to be executed after a specified delay. schedule(Callable<V> callable, long delay, TimeUnit unit): Schedules a value-returning task to be executed after a specified delay. scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit): Schedules a periodic task that runs after an initialDelay and then repeatedly with a fixed period between the start times of successive executions. scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit): Schedules a periodic task that runs after an initialDelay and then repeatedly with a fixed delay between the termination of one execution and the commencement of the next. execute(Runnable command): Inherited from ExecutorService, this method executes a task immediately with zero delay. submit(Runnable task) / submit(Runnable task, T result) / submit(Callable<T> task): Inherited from ExecutorService, these methods submit tasks for execution and return a Future representing the task's pending completion. shutdown(): Initiates an orderly shutdown where previously submitted tasks are executed, but no new tasks are accepted. shutdownNow(): Attempts to stop all actively executing tasks, halts the processing of waiting tasks, and returns a list of tasks that were awaiting execution. getQueue(): Returns the task queue used by this executor. getRemoveOnCancelPolicy(): Gets the policy on whether cancelled tasks should be immediately removed from the work queue. getContinueExistingPeriodicTasksAfterShutdownPolicy(): Gets the policy on whether to continue executing existing periodic tasks even after shutdown.
30 марта 2025
Формулировки в статье всеми способами пытаются затруднить понимание. Приходится перечитывать по 10 раз, чтобы понять максимально простую мысль, которую можно было расписать в предложение побольше, но гораздо понятнее. Как пример: - scheduleAtFixedRate - "Создает и выполняет периодическое действие, которое выполняется вначале после заданной начальной задержки..."; - scheduleWithFixedDelay - "Создает и выполняет периодическое действие, которое выполняется сначала после данной первоначальной задержки..."; Смысл и там и там одинаковый, но зачем менять написание? Если бы они были идентичны - то сразу было бы понятно - "Ага, в этом методы не отличаются, смотрим дальше". Но в итоге тратишь время на то, чтобы понять, что эта часть логики ни чем не отличается и задаешься вопросом "А зачем тогда было менять предложение?..." К тому же, можно было бы упростить написание в целом: "Создает и выполняет периодически действие, которое первый раз выполняется после заданной начальной задержки...". Даже если бы это было длиннее (а это не так) - это было бы намного понятнее. Это всё, конечно же, моё субъективное мнение, без претензии на истинность.
Марат Гарипов Уровень 108 Expert
28 июля 2022
после решения второй задачи в голове заиграла до боли знакомая мелодия...
Вячеслав Уровень 75 Expert
2 июля 2022
Ставьте плюс те, кто запустил и ждал вывода на экран в задаче "С ScheduledExecutor по галактике"😄
Юрий Кохно Уровень 62 Expert
23 апреля 2023
Вывод на экран придет вместе с офером
Михаил Уровень 50
20 ноября 2024
я уже 2 года сижу жду
Кирилл Уровень 46
21 октября 2025
Дождался?)