Ответ
Да, для этого в Java используется ScheduledExecutorService из пакета java.util.concurrent. Он позволяет планировать задачи на выполнение с задержкой или периодически, используя выделенный пул потоков.
Пример создания и использования:
import java.util.concurrent.*;
// Создание планировщика с пулом из 4 потоков
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(4);
// Запуск однократной задачи с задержкой в 5 секунд
scheduler.schedule(
() -> System.out.println("Task executed after delay"),
5,
TimeUnit.SECONDS
);
// Периодическое выполнение задачи каждые 2 секунды, начиная через 1 секунду
scheduler.scheduleAtFixedRate(
() -> System.out.println("Periodic task"),
1,
2,
TimeUnit.SECONDS
);
// Периодическое выполнение с фиксированной паузой *между* окончанием задачи и началом следующей
scheduler.scheduleWithFixedDelay(
() -> System.out.println("Task with fixed delay"),
1,
2,
TimeUnit.SECONDS
);
// Корректное завершение работы планировщика
scheduler.shutdown();
Ключевые особенности и best practices:
- Управление ресурсами: Пул потоков позволяет контролировать количество одновременно выполняемых задач и избегать создания новых потоков для каждой.
- Гибкость планирования: Поддержка
schedule,scheduleAtFixedRate(фиксированный интервал) иscheduleWithFixedDelay(фиксированная пауза после окончания задачи). - Важность завершения: Обязательно вызывать
shutdown()илиshutdownNow()для освобождения ресурсов JVM, иначе потоки останутся активными. - Обработка исключений: Исключения, выброшенные в задаче, прерывают её выполнение, но не завершают работу планировщика. Необходимо обрабатывать их внутри задачи.