1. Метод Thread.sleep()
У роботу Java-програми можна вставляти паузи. Зазвичай це не потрібно, адже користувачі хочуть, щоб їхні програми працювали якомога швидше. І навряд чи хтось із них зрадіє, якщо ви будете навмисно сповільнювати свій код.
Але у вас, як у програміста, може трапитися безліч ситуацій, коли пауза в коді буде корисною. Наприклад, ви програмуєте гру й хочете, щоб вона виконувала якісь дії один раз на дві секунди або кілька разів за секунду.
Загалом пауза — річ корисна, тому погляньмо, як же додати її в код. Це насправді дуже просто.
Thread.sleep(час);
де час
— це тривалість паузи в мілісекундах (1/1000
частка секунди).
Виконання такої команди призупинить вашу програму на час
милісекунд. Приклади:
|
Призупинить програму на 2 секунди. |
|
Призупинить програму на пів секунди. |
|
Призупинить програму на 1 годину. |
Отак це можна застосовувати на практиці. Припустімо, ми пишемо програму, яка запускатиме космічний корабель. Отакий вигляд міг би мати її код:
|
Програма щосекунди виводитиме на екран числа: спочатку 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
Дуже зручно працювати з такими властивостями: не потрібно замислюватися про перетворення, скажімо, годин на мілісекунди. Такий код і писати, і читати набагато приємніше.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ