1.Thread.sleep()

Możesz wstawiać przerwy w wykonywaniu programu Java. Zwykle nie jest to konieczne, ponieważ użytkownicy chcą, aby ich programy działały tak szybko, jak to możliwe. Niewiele osób byłoby zadowolonych, gdybyś celowo spowolnił swój kod.

Ale jako programista może zaistnieć mnóstwo sytuacji, w których przerwa w kodzie będzie przydatna. Załóżmy na przykład, że piszesz grę i chcesz, aby robiła coś co dwie sekundy lub kilka razy na sekundę.

Zasadniczo pauzy są przydatne, więc zobaczmy, jak dodać pauzę do kodu. To właściwie bardzo proste:

Thread.sleep(duration);

Gdzie duration jest długość pauzy w milisekundach ( 1/1000sekundy).

Ta instrukcja zatrzyma twój program na duration milisekundy. Przykłady:

Thread.sleep(2000);
Wstrzymuje program na 2 sekundy.
Thread.sleep(500);
Zatrzymuje program na pół sekundy.
Thread.sleep(60 * 60 * 1000);
Wstrzymuje program na 1 godzinę.

Oto jak można to wykorzystać w praktyce. Powiedzmy, że piszemy program, który wystrzeli statek kosmiczny. Tak może wyglądać kod:

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

System.out.println("Let's go!");
Co sekundę program wyświetli liczbę: 10, potem 9, potem 8itd.




Gdy liczba osiągnie 0, program wyświetli „ Let's go!

2. Prawidłowe obliczanie pauzy

Długość przerwy łatwo obliczyć. Jeśli potrzebujesz, aby program zrobił coś raz na sekundę, to przerwa wynosi 1000 ms. Jeśli 2 razy na sekundę, zatrzymaj się na 500 ms (1000/2).

Jeśli musisz zrobić coś 15 razy na sekundę, zatrzymaj się na 66 ms (1000/15). Wszystko wydaje się dość proste:

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

Ale jest tutaj bardzo ważny niuans. Chociaż wiele instrukcji wykonuje się bardzo szybko, nie są one natychmiastowe.

Spójrz na to. Załóżmy, że masz akcję, której ukończenie zajmuje 100 ms. Chcesz wykonać tę czynność 5 razy na sekundę. Jak długo należy pauzować? Na pewno nie 200ms.

Aby akcja była wykonywana 5 razy na sekundę, potrzebujemy czasu potrzebnego na wykonanie akcji plus czas trwania pauzy równy 200 ms. Jeśli to zrobimy, będzie działać dokładnie 5 razy na sekundę. W naszym przypadku akcja wymaga 100 ms, co oznacza, że ​​do pauzy zostało jeszcze 100 ms.

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

Twórcy gier doskonale zdają sobie sprawę z tego, że czas potrzebny do wykonania akcji jest znacznie większy od zera. Podobnie jak ludzie, którzy grają w gry.

Jeśli gra działa w 20 klatkach na sekundę, oznacza to, że może narysować na ekranie tylko 20 klatek w ciągu jednej sekundy. 1000/20daje 50 ms. Jest to czas potrzebny do narysowania ramki podczas gry.



3. Nanosekundy

Dzisiejsze komputery są znacznie szybsze niż wtedy, gdy stworzono Javę. Oznacza to, że pauza trwająca 1 milisekundę może nie być wystarczająco szczegółowa.

Załóżmy, że mamy jakąś bardzo krótką akcję, którą chcemy wykonać 2000 razy na sekundę. Jak zrobić pauzę na pół milisekundy?

W tym celu istnieje jeszcze jeden wariant metody Thread.sleep():

Thread.sleep(milliseconds, nanoseconds);

Ta metoda powoduje uśpienie programu na określoną liczbę milisekund i nanosekund.

Nanosekundy to jedna milionowa milisekundy. Oznacza to, że przerwa trwająca półtora milisekundy wyglądałaby tak:

Thread.sleep(1, 500_000);

A jeśli chcesz zatrzymać 1/10milisekundę, musisz napisać to:

Thread.sleep(0, 100_000);

Być może nie używasz teraz tej metody w swoich programach. Ale lepiej o tym wiedzieć i nie używać, niż potrzebować i nie wiedzieć o tym.



4. TimeUnitklasa

Nawiasem mówiąc, Java ma jeszcze jedną klasę, która ułatwi ci życie, jeśli zdecydujesz się spowolnić aplikację. Mówimy o TimeUnitklasie w java.util.concurrentpakiecie.

Pamiętaj, że ponieważ klasy nie ma w pakiecie java.lang, musisz albo dodać linię import java.util.concurrent.TimeUnit;, albo pisać java.util.concurrent.TimeUnitza każdym razem w swoim kodzie.

Ta klasa robi to samo co Thread.sleep(), ale jest wygodniejsza:

TimeUnit.HOURS.sleep(15)

Ten kod uśpi Twój program na 15 godzin. Dostępne są również minuty, sekundy, dni. A także mikrosekundy (1/1000 000) i nanosekundy (1/1000 000 000).

Klasa TimeUnit ma następujące właściwości:

  • nanosekundy:NANOSECONDS
  • mikrosekundy:MICROSECONDS
  • milisekundy:MILLISECONDS
  • sekundySECONDS
  • minuty:MINUTES
  • godziny:HOURS
  • dni:DAYS

Praca z tymi właściwościami jest bardzo wygodna, ponieważ nie trzeba myśleć o zamianie, powiedzmy, godzin na milisekundy. Taki kod dużo przyjemniej się pisze i czyta.

Więcej szczegółów można przeczytać tutaj .