JavaRush /Курсы /Java Syntax Pro /Паузы в программе

Паузы в программе

Java Syntax Pro
8 уровень , 3 лекция
Открыта

1. Метод Thread.sleep()


В работу программы на Java можно вставлять паузы. Обычно это не нужно, т.к. пользователи хотят, чтобы их программы работали как можно быстрее. И вряд ли кто-то из них обрадуется, если вы будете специально замедлять свой код.

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

В общем, пауза вещь полезная, поэтому смотрим, как же добавить паузу в код. Это на самом деле очень просто:

Thread.sleep(время);

Где время — это длина паузы в миллисекундах (1/1000 часть секунды).

Исполнение такой команды приостановит вашу программу на время миллисекунд. Примеры:

Thread.sleep(2000);
Приостановит программу на 2 секунды.
Thread.sleep(500);
Приостановит программу на полсекунды.
Thread.sleep(60 * 60 * 1000);
Приостановит программу на 1 час.

Вот как это можно использовать на практике. Допустим, мы пишем программу, которая бы запускала космический корабль. Так бы мог выглядеть ее код:

for (int i = 10; i > 0; i--)
{
   System.out.println(i);
   Thread.sleep(1000);
}

System.out.println("Поехали");
Программа будет выводить на экран каждую секунду числа 10, затем 9, затем 8 и т.д.




Когда счет дойдет до 0, программа выведет надпись Поехали.

2. Правильный расчет пауз


Длину паузы считать легко. Если вам нужно, чтобы программа что-то делала раз в секунду, поставьте паузу — 1000 мс. Если 2 раза в секунду, поставьте паузу 500 мс (1000/2).

Если нужно выполнять что-то 15 раз в секунду, паузу делаем длинной 66 мс (1000/15). Вроде бы все очень просто:

Длительность одного витка цикла = 1000 / количество раз в секунду

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

Смотрите. Допустим, у вас есть какое-то действие, выполнение которого занимает 100 мс. Вы хотите, чтобы оно выполнялось 5 раз в секунду. Какую длину паузы вам нужно выбрать? Точно не 200 мс.

Чтобы действие выполнялось 5 раз в секунду, нужно чтобы время выполнения действия + пауза равнялись 200 мс. Тогда оно действительно будет выполняться 5 раз в секунду. В нашем случае действие выполняется 100 мс, значит на паузу остается еще 100 мс

длина паузы = длительность одного витка циклавремя выполнения действия

То, что время выполнения действия гораздо выше нуля, хорошо понимают разработчики игр. Хотя и люди, играющие в игры, тоже.

Если у игры 20 FPS, это значит, что за одну секунду она успевает отрисовать на экране всего 20 кадров. 1000/20 — получаем 50 мс. Именно столько длится время отрисовки кадра игры.

3. Наносекунды


Современные компьютеры гораздо быстрее, чем во времена создания Java. Поэтому паузы в 1 миллисекунду может быть уже недостаточно.

Допустим мы осуществляем какое-то очень быстрое действие и хотим выполнять его 2000 раз в секунду. Как нам сделать паузу в пол миллисекунды?

А вот для этого есть еще одна модификация метода Thread.sleep():

Thread.sleep(миллисекунды, наносекунды);

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

Наносекунды — это 1 миллионная от миллисекунд. Поэтому пауза в полторы миллисекунды будет выглядеть так:

Thread.sleep(1, 500_000);

Ну а если вы хотите паузу в 1/10 миллисекунды, вам нужно будет написать так:

Thread.sleep(0, 100_000);

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

4. Класс TimeUnit


Кстати, в Java есть еще один класс, который облегчит вашу жизнь, если вы таки решите сделать ваше приложение еще медленнее — это класс TimeUnit из пакета java.util.concurrent.

И, как вы помните, если пакет класса не java.lang, нужно или добавить строку import java.util.concurrent.TimeUnit;, или писать каждый раз в коде java.util.concurrent.TimeUnit

Этот класс делает то же самое, что и Thread.sleep(), просто удобнее:

TimeUnit.HOURS.sleep(15)

Этот код усыпит вашу программу на 15 часов. Также доступны минуты, секунды, дни.  А еще — микросекунды (1/1000,000) и наносекунды (1/1000,000,000).

У класса TimeUnit есть такие свойства:

  • наносекунды: NANOSECONDS
  • микросекунды: MICROSECONDS
  • миллисекунды: MILLISECONDS
  • секунды: SECONDS
  • минуты: MINUTES
  • часы: HOURS
  • дни: DAYS

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

Комментарии (280)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Виктор Уровень 9
18 декабря 2025
митольный будильничек
Evgenii Petrov Уровень 10
25 октября 2025
и 24 с копейками на последней задаче...
Evgenii Petrov Уровень 10
25 октября 2025
вот и 24665 решивших, а было 35 тыс...
C0N5P1RACY Уровень 37
7 декабря 2025
Всегда так :) Проходил до этого курс по Python на Stepik, там график еще кривее вниз получался, в начале почти 100к народу проходило задачи, тысячи коментариев, а в конце даже до тысячи не доходило (решений), а коментов максимум 20 :) Многие начинают и заканчивают сразу, еще больше не доходят до конца, потом еще 90% людей что закончили все таки курс, не развиваются дальше, и так и получается что из 100.000 начавших курс, на работу (в IT сфере) приходят максимум человека 3. А все и дальше будут кричать про "переполненный IT пузырь" :)
Grigoryvvv Уровень 14 Expert
16 октября 2025
16.10.2025 / 9 уровень
Aidar Mukushev Уровень 8
21 сентября 2025
накидайте лайков для ачиквки плз <3
Серафим Уровень 10
9 сентября 2025
Тут оказывается почему у многих ошибка - потому что в ТЗ помимо того, что нужно выводить числа 1-10, сказано второе не менее важное условие. Что пауза должна быть именно 9 раз. То есть после вывода числа 10 на экран нет необходимости выжидать паузу до завершения цикла и программы в целом.
Newcomerjava Уровень 12
1 сентября 2025
Просто добавьте условие когда i = 10, и используйте break.
Vadim Уровень 17
22 августа 2025

public class Solution {

    public static void main(String[] args) throws InterruptedException {
        printNumbers();
    }

    public static void printNumbers() throws InterruptedException {
        for (int i = 1; i <=10; i++){
            Thread.sleep(1, 300_000);
            System.out.println(i);

        }
    }
}
почему мой код не принимает? Видимо тут 10 , а не 9. Спасибо за отличную задачу!
Виктор Уровень 9
18 декабря 2025
просто тупо условный оператор на счётчик 10, с отменой цикла
Vadim Уровень 17
22 августа 2025
throws InterruptedException это от куда взялось? ни слова нет об этом
11 августа 2025
Едем дальше