1.Thread.sleep()

Puteți introduce pauze în execuția unui program Java. Acest lucru nu este de obicei necesar, deoarece utilizatorii doresc ca programele lor să ruleze cât mai repede posibil. Nu mulți oameni ar fi fericiți dacă ați încetini în mod deliberat codul.

Dar, ca programator, pot exista o mulțime de situații în care o pauză în codul tău va fi utilă. De exemplu, să presupunem că scrieți un joc și doriți ca acesta să facă ceva o dată la două secunde sau de câteva ori pe secundă.

Practic, pauzele sunt utile, așa că haideți să vedem cum să adăugați o pauză la codul dvs. De fapt este foarte simplu:

Thread.sleep(duration);

Unde duration este durata pauzei în milisecunde ( 1/1000de secundă).

Această declarație va întrerupe programul pentru duration milisecunde. Exemple:

Thread.sleep(2000);
Întrerupe programul timp de 2 secunde.
Thread.sleep(500);
Întrerupe programul pentru o jumătate de secundă.
Thread.sleep(60 * 60 * 1000);
Întrerupe programul timp de 1 oră.

Iată cum poate fi folosit în practică. Să presupunem că scriem un program care va lansa o navă spațială. Iată cum ar putea arăta codul:

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

System.out.println("Let's go!");
În fiecare secundă, programul va afișa un număr: 10, apoi 9, apoi 8, etc.




Când numărul ajunge la 0, programul va afișa „ Let's go!

2. Calcularea corectă a unei pauze

Durata pauzei este ușor de calculat. Dacă aveți nevoie ca programul să facă ceva o dată pe secundă, atunci pauza este de 1000 ms. Dacă este de 2 ori pe secundă, faceți o pauză de 500 ms (1000/2).

Dacă trebuie să faceți ceva de 15 ori pe secundă, faceți o pauză de 66 ms (1000/15). Totul pare destul de simplu:

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

Dar aici există o nuanță foarte importantă. Deși multe instrucțiuni se execută foarte repede, ele nu sunt instantanee.

Uita-te la asta. Să presupunem că aveți o acțiune care durează 100 ms. Doriți să efectuați această acțiune de 5 ori pe secundă. Cât timp ar trebui să faceți o pauză? Cu siguranță nu 200 ms.

Pentru ca acțiunea să fie efectuată de 5 ori pe secundă, avem nevoie de timpul necesar executării acțiunii plus durata pauzei să fie egală cu 200 ms. Dacă facem asta, atunci va rula exact de 5 ori pe secundă. În cazul nostru, acțiunea necesită 100 ms, ceea ce înseamnă că mai sunt 100 ms pentru pauză.

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

Dezvoltatorii de jocuri sunt bine conștienți de faptul că timpul necesar pentru a executa o acțiune este mult mai mare decât zero. La fel și oamenii care joacă jocuri.

Dacă un joc rulează la 20 FPS, înseamnă că poate desena doar 20 de cadre pe ecran într-o secundă. 1000/20produce 50 ms. Acesta este timpul necesar pentru a desena un cadru în timpul jocului.



3. Nanosecunde

Calculatoarele de astăzi sunt mult mai rapide decât atunci când a fost creat Java. Aceasta înseamnă că o pauză de 1 milisecundă poate să nu fie suficient de granulară.

Să presupunem că avem o acțiune foarte scurtă pe care vrem să o facem de 2000 de ori pe secundă. Cum facem o pauză de o jumătate de milisecundă?

Pentru aceasta, mai există o variantă a Thread.sleep()metodei:

Thread.sleep(milliseconds, nanoseconds);

Această metodă pune programul în stare de repaus pentru cantitatea specificată de milisecunde și nanosecunde.

Nanosecundele sunt 1 milione dintr-o milisecundă. Asta înseamnă că o pauză de o milisecundă și jumătate ar arăta astfel:

Thread.sleep(1, 500_000);

Și dacă doriți o pauză de 1/10o milisecundă, trebuie să scrieți asta:

Thread.sleep(0, 100_000);

Este posibil să nu utilizați această metodă în programele dvs. chiar acum. Dar este mai bine să știi despre el și să nu îl folosești decât să ai nevoie de el și să nu știi despre el.



4. TimeUnitclasa

Apropo, Java are o altă clasă care îți va face viața mai ușoară dacă decideți să încetiniți aplicația. Vorbim despre TimeUnitclasa din java.util.concurrentpachet.

Amintiți-vă că, deoarece clasa nu este în java.langpachet, atunci fie trebuie să adăugați linia import java.util.concurrent.TimeUnit;, fie să scrieți java.util.concurrent.TimeUnitde fiecare dată în cod.

Această clasă face același lucru ca și Thread.sleep(), dar este mai convenabilă:

TimeUnit.HOURS.sleep(15)

Acest cod va pune programul în stare de repaus timp de 15 ore. Sunt disponibile și minute, secunde, zile. La fel și microsecunde (1/1000.000) și nanosecunde (1/1000.000.000).

Clasa TimeUnit are următoarele proprietăți:

  • nanosecunde:NANOSECONDS
  • microsecunde:MICROSECONDS
  • milisecunde:MILLISECONDS
  • secundeSECONDS
  • minute:MINUTES
  • ore:HOURS
  • zile:DAYS

Lucrul cu aceste proprietăți este foarte convenabil, deoarece nu este nevoie să te gândești la conversia, de exemplu, a orelor în milisecunde. Un astfel de cod este mult mai plăcut de scris și citit.

Mai multe detalii pot fi citite aici .