Как сделать паузу в программе
Короткий ответ
Thread.sleep() приостанавливает текущий поток на заданное число миллисекунд:
void main() throws InterruptedException {
IO.println("Starting...");
Thread.sleep(500);
IO.println("Done after half a second");
}Результат:
Starting...
Done after half a secondsleep() может выбросить проверяемое InterruptedException, поэтому у main есть throws.
Через Duration
С Java 19 sleep() принимает Duration — так единицы времени видны сразу:
void main() throws InterruptedException {
for (int i = 3; i > 0; i--) {
IO.println(i);
Thread.sleep(Duration.ofMillis(300));
}
IO.println("Go!");
}Результат:
3
2
1
Go!Повторять по расписанию
ScheduledExecutorService выполняет задачу с заданным интервалом, не блокируя основной поток:
void main() throws InterruptedException {
var counter = new AtomicInteger();
try (var scheduler = Executors.newSingleThreadScheduledExecutor()) {
scheduler.scheduleAtFixedRate(
() -> IO.println("tick " + counter.incrementAndGet()), 0, 200, TimeUnit.MILLISECONDS);
Thread.sleep(500);
scheduler.shutdownNow();
}
}Результат:
tick 1
tick 2
tick 3Задача запускается сразу, затем каждые 200 мс; через полсекунды планировщик останавливается. Обычно успевает три запуска, но точное число зависит от загрузки компьютера.
Частая ошибка
«Проглатывать» InterruptedException пустым catch. Прерывание — сигнал потоку остановиться, и его нельзя терять. Если вы не можете пробросить исключение дальше, восстановите флаг:
void main() {
Thread.currentThread().interrupt();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
IO.println("interrupted, stopping");
}
}Результат:
interrupted, stoppingФункции из этого ответа
- Thread.sleep() — Приостанавливает текущий поток на заданное время.
- ExecutorService — Сервис, который выполняет задачи в пуле потоков.