1.Thread.sleep()

Du kan infoga pauser i körningen av ett Java-program. Detta är vanligtvis inte nödvändigt, eftersom användarna vill att deras program ska köras så snabbt som möjligt. Det är inte många som skulle vara glada om du medvetet saktade ner din kod.

Men som programmerare kan det finnas massor av situationer där en paus i din kod kommer att vara användbar. Anta till exempel att du skriver ett spel och du vill att det ska göra något varannan sekund eller flera gånger i sekunden.

I grund och botten är pauser användbara, så låt oss se hur du lägger till en paus i din kod. Det är faktiskt väldigt enkelt:

Thread.sleep(duration);

Var duration är längden på pausen i millisekunder ( 1/1000av en sekund).

Detta uttalande kommer att pausa ditt program i duration millisekunder. Exempel:

Thread.sleep(2000);
Pausar programmet i 2 sekunder.
Thread.sleep(500);
Pausar programmet i en halv sekund.
Thread.sleep(60 * 60 * 1000);
Pausar programmet i 1 timme.

Så här kan det användas i praktiken. Låt oss säga att vi skriver ett program som ska lansera ett rymdskepp. Så här kan koden se ut:

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

System.out.println("Let's go!");
Varje sekund kommer programmet att visa ett nummer: , 10sedan 9, sedan 8, etc.




När räkningen når 0, kommer programmet att visa " Let's go!"

2. Beräkna en paus korrekt

Längden på pausen är lätt att beräkna. Om du behöver att programmet ska göra något en gång i sekunden är pausen 1000 ms. Om 2 gånger per sekund, pausa sedan i 500ms (1000/2).

Om du behöver göra något 15 gånger per sekund, pausa i 66 ms (1000/15). Det hela verkar ganska okomplicerat:

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

Men det finns en mycket viktig nyans här. Även om många uttalanden körs väldigt snabbt, är de inte omedelbara.

Titta på det här. Låt oss säga att du har en åtgärd som tar 100 ms att slutföra. Du vill utföra denna åtgärd 5 gånger per sekund. Hur länge ska du pausa? Absolut inte 200ms.

För att åtgärden ska utföras 5 gånger per sekund behöver vi den tid som krävs för att utföra åtgärden plus pauslängden för att vara lika med 200 ms. Om vi ​​gör det kommer den att köras exakt 5 gånger per sekund. I vårt fall kräver åtgärden 100 ms, vilket innebär att det fortfarande är 100 ms kvar till paus.

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

Spelutvecklare är väl medvetna om att tiden som krävs för att utföra en åtgärd är mycket längre än noll. Och det är de som spelar spel också.

Om ett spel körs med 20 FPS betyder det att det bara kan rita 20 bilder på skärmen på en sekund. 1000/20ger 50 ms. Detta är den tid som krävs för att rita en ram medan du spelar spelet.



3. Nanosekunder

Datorer idag är mycket snabbare än när Java skapades. Det betyder att en paus på 1 millisekund kanske inte är tillräckligt granulär.

Anta att vi har någon superkort handling som vi vill utföra 2000 gånger per sekund. Hur pausar vi en halv millisekund?

För detta finns det ytterligare en variant av Thread.sleep()metoden:

Thread.sleep(milliseconds, nanoseconds);

Denna metod försätter programmet i viloläge under den angivna mängden millisekunder och nanosekunder.

Nanosekunder är 1 miljondels millisekund. Det betyder att en paus på en och en halv millisekund skulle se ut så här:

Thread.sleep(1, 500_000);

Och om du vill ha en paus på 1/10en millisekund måste du skriva detta:

Thread.sleep(0, 100_000);

Du kanske inte använder den här metoden i dina program just nu. Men det är bättre att veta om det och inte använda det än att behöva det och inte veta om det.



4. TimeUnitklass

Java har förresten en annan klass som kommer att göra ditt liv enklare om du bestämmer dig för att sakta ner din applikation. Vi pratar om TimeUnitklassen i java.util.concurrentpaketet.

Kom ihåg att eftersom klassen inte finns i paketet java.langmåste du antingen lägga till raden import java.util.concurrent.TimeUnit;eller skriva java.util.concurrent.TimeUnitvarje gång i din kod.

Den här klassen gör samma sak som Thread.sleep(), men det är bekvämare:

TimeUnit.HOURS.sleep(15)

Denna kod försätter ditt program i viloläge i 15 timmar. Minuter, sekunder, dagar är också tillgängliga. Samt mikrosekunder (1/1 000 000) och nanosekunder (1/1 000 000 000).

Klassen TimeUnit har följande egenskaper:

  • nanosekunder:NANOSECONDS
  • mikrosekunder:MICROSECONDS
  • millisekunder:MILLISECONDS
  • sekunderSECONDS
  • minuter:MINUTES
  • timmar:HOURS
  • dagar:DAYS

Att arbeta med dessa egenskaper är superbekvämt, eftersom det inte finns något behov av att tänka på att konvertera till exempel timmar till millisekunder. Sådan kod är mycket trevligare att skriva och läsa.

Mer detaljer finns att läsa här .