Как делать периодические запросы без Thread.sleep?

В Java, периодические запросы можно делать без использования Thread.sleep с помощью класса ScheduledExecutorService. Данный класс предоставляет удобные методы для планирования и выполнения задач с определенным интервалом.

Вот пример кода, демонстрирующий использование ScheduledExecutorService для периодического выполнения задачи:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Main {
    public static void main(String[] args) {
        // Создаем экземпляр ScheduledExecutorService с помощью фабричного метода Executors.newScheduledThreadPool()
        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);

        // Запускаем задачу через 0 секунд с периодом 1 секунда
        executorService.scheduleAtFixedRate(() -> {
            // выполнение периодической задачи
            System.out.println("Выполняется периодическая задача");
        }, 0, 1, TimeUnit.SECONDS);

        // Ждем некоторое время, чтобы пример не завершался сразу
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Остановка планировщика задач
        executorService.shutdown();
    }
}

В данном примере мы создаем ScheduledExecutorService с помощью метода Executors.newScheduledThreadPool(1), который создает планировщик с одним рабочим потоком. Затем мы используем метод scheduleAtFixedRate, чтобы запланировать задачу, которая будет выполняться сразу после запуска и повторяться с указанным интервалом - 1 секунда.

На выходе мы получим следующий вывод:

Выполняется периодическая задача
Выполняется периодическая задача
Выполняется периодическая задача
Выполняется периодическая задача
Выполняется периодическая задача

После запуска периодической задачи, мы ждем некоторое время (в данном случае 5 секунд) и останавливаем планировщик с помощью метода shutdown.

Использование ScheduledExecutorService поможет вам достичь периодического выполнения задач без использования Thread.sleep. Он предоставляет удобные методы для более точного управления такими задачами и гарантирует их корректное выполнение.