1.Thread.sleep()

Можете да вмъкнете паузи в изпълнението на Java програма. Това обикновено не е необходимо, тъй като потребителите искат техните програми да работят възможно най-бързо. Не много хора биха се зарадвали, ако умишлено забавите codeа си.

Но като програмист може да има много ситуации, в които паузата във вашия code ще бъде полезна. Например, да предположим, че пишете игра и искате тя да прави нещо веднъж на всеки две секунди or няколко пъти в секунда.

По принцип паузите са полезни, така че нека да видим How да добавите пауза към вашия code. Всъщност е много просто:

Thread.sleep(duration);

Къде duration е дължината на паузата в мorсекунди ( 1/1000от секунда).

Това изявление ще постави на пауза вашата програма за duration мorсекунди. Примери:

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

Ето How може да се използва на практика. Да кажем, че пишем програма, която ще изстреля космически кораб. Ето How може да изглежда codeът:

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

System.out.println("Let's go!");
Всяка секунда програмата ще показва число: 10, след това , 9след това 8и т.н.




Когато броячът достигне 0, програмата ще извежда " Let's go!"

2. Правилно изчисляване на пауза

Продължителността на паузата е лесна за изчисляване. Ако имате нужда програмата да прави нещо веднъж в секунда, тогава паузата е 1000 ms. Ако 2 пъти в секунда, направете пауза за 500 ms (1000/2).

Ако трябва да направите нещо 15 пъти в секунда, направете пауза за 66 ms (1000/15). Всичко изглежда доста просто:

The duration of one iteration of the loop = 1000 / number of times per second

Но тук има един много важен нюанс. Въпреки че много оператори се изпълняват много бързо, те не са мигновени.

Виж това. Да приемем, че имате действие, което отнема 100 мorсекунди за изпълнение. Искате да извършите това действие 5 пъти в секунда. Колко време трябва да направите пауза? Определено не 200ms.

За да се извърши действието 5 пъти в секунда, трябва времето, необходимо за изпълнение на действието, плюс продължителността на паузата да бъде равно на 200 ms. Ако направим това, то ще работи точно 5 пъти в секунда. В нашия случай действието изисква 100 ms, което означава, че остават още 100 ms за пауза.

pause duration = duration of one iteration of the loop - time required to execute the action

Разработчиците на игри са добре запознати с факта, че времето, необходимо за изпълнение на действие, е много по-високо от нула. Както и хората, които играят игри.

Ако една игра работи с 20 FPS, това означава, че може да нарисува само 20 кадъра на екрана за една секунда. 1000/20дава 50 ms. Това е времето, необходимо за начертаване на рамка, докато играете играта.



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

Компютрите днес са много по-бързи, отколкото при създаването на Java. Това означава, че пауза от 1 мorсекунда може да не е достатъчно детайлна.

Да предположим, че имаме няHowво супер кратко действие, което искаме да извършим 2000 пъти в секунда. Как да направим пауза за половин мorсекунда?

За това има още един вариант на Thread.sleep()метода:

Thread.sleep(milliseconds, nanoseconds);

Този метод поставя програмата в режим на заспиване за определен период от мorсекунди и наносекунди.

Наносекунди са 1 мorонна от мorсекунда. Това означава, че пауза от една и половина мorсекунди ще изглежда така:

Thread.sleep(1, 500_000);

И ако искате пауза от 1/10мorсекунда, трябва да напишете това:

Thread.sleep(0, 100_000);

Може да не използвате този метод в програмите си в момента. Но е по-добре да знаете за него и да не го използвате, отколкото да имате нужда от него и да не знаете за него.



4. TimeUnitклас

Между другото, Java има още един клас, който ще улесни живота ви, ако решите да забавите приложението си. Говорим за TimeUnitкласа в java.util.concurrentпакета.

Не забравяйте, че тъй като класът не е в java.langпакета, трябва or да добавите реда import java.util.concurrent.TimeUnit;, or да пишете java.util.concurrent.TimeUnitвсеки път във вашия code.

Този клас прави същото като Thread.sleep(), но е по-удобен:

TimeUnit.HOURS.sleep(15)

Този code ще постави вашата програма в режим на заспиване за 15 часа. Налични са и minutesи, секунди, дни. Както и микросекунди (1/1000 000) и наносекунди (1/1000 000 000).

Класът TimeUnit има следните свойства:

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

Работата с тези свойства е супер удобна, тъй като няма нужда да мислите за преобразуване, да речем, на часове в мorсекунди. Такъв code е много по-приятен за писане и четене.

Повече подробности можете да прочетете тук .