1.Thread.sleep()

Szüneteket szúrhat be a Java programok végrehajtásába. Erre általában nincs szükség, mivel a felhasználók azt akarják, hogy programjaik a lehető leggyorsabban fussanak. Nem sokan örülnének, ha szándékosan lelassítanák a kódot.

Programozóként azonban rengeteg olyan helyzet adódhat, amikor hasznos lehet egy szünet a kódban. Tegyük fel például, hogy játékot ír, és azt akarja, hogy két másodpercenként egyszer vagy másodpercenként többször csináljon valamit.

Alapvetően a szünetek hasznosak, ezért nézzük meg, hogyan adhatunk szünetet a kódhoz. Valójában nagyon egyszerű:

Thread.sleep(duration);

Hol duration van a szünet hossza ezredmásodpercben ( 1/1000másodpercben).

Ez az utasítás ezredmásodpercekre szünetelteti a programot duration . Példák:

Thread.sleep(2000);
2 másodpercre szünetelteti a programot.
Thread.sleep(500);
Fél másodpercre szünetelteti a programot.
Thread.sleep(60 * 60 * 1000);
1 órára szünetelteti a programot.

Íme, hogyan használható a gyakorlatban. Tegyük fel, hogy írunk egy programot, ami egy űrhajót indít. Így nézhet ki a kód:

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

System.out.println("Let's go!");
A program másodpercenként egy számot jelenít meg: 10, majd 9, majd 8, stb.




Amikor a szám eléri a számot 0, a program a következőt jeleníti meg: " Let's go!"

2. Szünet helyes kiszámítása

A szünet hossza könnyen kiszámítható. Ha a programnak másodpercenként egyszer kell tennie valamit, akkor a szünet 1000 ms. Ha másodpercenként kétszer, akkor szüneteljen 500 ms-ig (1000/2).

Ha másodpercenként 15-ször kell tennie valamit, álljon meg 66 ms-ig (1000/15). Eléggé egyértelműnek tűnik az egész:

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

De van itt egy nagyon fontos árnyalat. Bár sok kijelentés nagyon gyorsan végrehajtódik, nem azonnali.

Ezt nézd. Tegyük fel, hogy van egy művelete, amelynek végrehajtása 100 ms-ig tart. Ezt a műveletet másodpercenként 5-ször szeretné végrehajtani. Meddig kell szünetet tartani? 200 ms biztosan nem.

Ahhoz, hogy a műveletet másodpercenként 5 alkalommal hajtsák végre, a művelet végrehajtásához szükséges időnek plusz a szünet időtartamának 200 ms-nak kell lennie. Ha ezt tesszük, akkor pontosan 5-ször fog futni másodpercenként. Esetünkben a művelethez 100 ms kell, ami azt jelenti, hogy még 100 ms van hátra a szünetig.

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

A játékfejlesztők tisztában vannak azzal a ténnyel, hogy egy művelet végrehajtásához szükséges idő sokkal magasabb, mint a nulla. És azok az emberek is, akik játszanak.

Ha egy játék 20 FPS-sel fut, az azt jelenti, hogy egy másodperc alatt csak 20 képkockát tud felhúzni a képernyőre. 1000/2050 ms-t ad ki. Ez az az idő, ameddig játék közben egy keretet rajzol .



3. Nanoszekundum

A számítógépek ma sokkal gyorsabbak, mint a Java létrehozásakor. Ez azt jelenti, hogy az 1 ezredmásodperces szünet nem elég részletes.

Tegyük fel, hogy van valami szuper rövid akciónk, amit másodpercenként 2000-szer szeretnénk végrehajtani. Hogyan álljunk meg fél ezredmásodpercig?

Ehhez a módszernek van még egy változata Thread.sleep():

Thread.sleep(milliseconds, nanoseconds);

Ez a módszer alvó állapotba helyezi a programot a megadott milliszekundum és nanoszekundum időtartamára.

A nanoszekundumok a milliszekundum 1 milliomod része. Ez azt jelenti, hogy egy másfél ezredmásodperces szünet így nézne ki:

Thread.sleep(1, 500_000);

És ha egy ezredmásodperces szünetet szeretne 1/10, akkor ezt kell beírnia:

Thread.sleep(0, 100_000);

Lehetséges, hogy jelenleg nem használja ezt a módszert a programjaiban. De jobb tudni róla, és nem használni, mint ha szüksége van rá, és nem tudni róla.



4. TimeUnitosztály

A Java-nak egyébként van egy másik osztálya is, amely megkönnyíti az életét, ha úgy dönt, hogy lelassítja az alkalmazást. TimeUnitA csomagban lévő osztályról beszélünk java.util.concurrent.

Ne feledje, hogy mivel az osztály nincs a csomagban java.lang, akkor vagy hozzá kell adnia a sort import java.util.concurrent.TimeUnit;, vagy java.util.concurrent.TimeUnitminden alkalommal be kell írnia a kódot.

Ez az osztály ugyanazt csinálja, mint Thread.sleep(), de kényelmesebb:

TimeUnit.HOURS.sleep(15)

Ez a kód 15 órára alvó állapotba helyezi a programot. Percek, másodpercek, napok is rendelkezésre állnak. Valamint mikroszekundum (1/1000 000) és nanoszekundum (1/1000 000 000).

Az TimeUnit osztály a következő tulajdonságokkal rendelkezik:

  • nanoszekundum:NANOSECONDS
  • mikroszekundum:MICROSECONDS
  • ezredmásodperc:MILLISECONDS
  • másodpercigSECONDS
  • percek:MINUTES
  • órák:HOURS
  • napok:DAYS

Ezekkel a tulajdonságokkal rendkívül kényelmes dolgozni, mivel nem kell gondolni például az órák ezredmásodpercekre való konvertálására. Az ilyen kódokat sokkal kellemesebb írni és olvasni.

További részletek itt olvashatók .