JavaRush /Курси /Java Syntax Zero /Паузи в програмі

Паузи в програмі

Java Syntax Zero
Рівень 9 , Лекція 4
Відкрита

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

Дуже зручно працювати з такими властивостями: не потрібно замислюватися про перетворення, скажімо, годин на мілісекунди. Такий код і писати, і читати набагато приємніше.

Коментарі (12)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
IronMan57 Рівень 28
29 листопада 2024
В останній задачі наліпив лишніх умовних операторів if. Можливо варто зазначити, що при визовах методу sleep для різних властивостей (DAYS, .., NANOSECONDS) классу TimeUnit, якщо аргумент, менший або дорівнює нулю, програма призупинятись не буде.
4 грудня 2024
там наче прописані ексепшнс. та вцілому зазвичай про обробку значень вказують в умовах задач, то ж певно що ти заморочуєшся на даних рівнях)
Potapchuk Рівень 13
10 вересня 2023
Ніяк не міг зрозуміти, що програма із затримкою має виводити 9 цифр, а на екрані має бути 10 цифр, читай УМОВУ! P.S. і додай нарешті ще один SOUT;
14 травня 2023
Азарт правильно написати завдання з першого разу навчив мене уважно читати умову)
kalkulator¹ Рівень 51
3 листопада 2022
в мене виникла проблема з інтеледжі ідеа, коли я натискаю run main на задачі з якою я зараз працюю, в мене спрацьовує інша задача яку я робив ще на 7 рівні
Василь Рівень 4
30 липня 2023
треба клацати правою кнопкою миші на класі Solution в тій задачі котру хочете запустити і вибрати "Run" Або скористатися комбінацією клавіш Ctrl + Shift + F10
Neridnyi Taras Рівень 23
29 вересня 2022
Люблю JAVA
Roma Chernesh Рівень 16
22 грудня 2022
Не любив би, до 22ого рівня не довчився би:)
Василь Рівень 4
30 липня 2023
він вже Developer, навіть не Junior )
Гаркін Рівень 14
11 березня 2024
А дехто вже trainee в Kindgeek . Вітаю!
Василь Рівень 4
12 березня 2024
Дякую )
Харченко Иван Рівень 15
4 лютого 2022
Крута штука TimeUnit - піду нашаманю собі будильника😆