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

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