1.Thread.sleep()
Du kan indsætte pauser i udførelsen af et Java-program. Dette er normalt ikke nødvendigt, da brugerne ønsker, at deres programmer skal køre så hurtigt som muligt. Ikke mange mennesker ville være glade, hvis du bevidst bremsede din kode.
Men som programmør kan der være tonsvis af situationer, hvor en pause i din kode vil være nyttig. Antag for eksempel, at du skriver et spil, og du vil have det til at gøre noget hvert andet sekund eller flere gange i sekundet.
Grundlæggende er pauser nyttige, så lad os se, hvordan du tilføjer en pause til din kode. Det er faktisk meget enkelt:
Thread.sleep(duration);
Hvor duration
er længden af pausen i millisekunder ( 1/1000
af et sekund).
Denne erklæring vil sætte dit program på pause i duration
millisekunder. Eksempler:
|
Sætter programmet på pause i 2 sekunder. |
|
Sætter programmet på pause i et halvt sekund. |
|
Sætter programmet på pause i 1 time. |
Her er hvordan det kan bruges i praksis. Lad os sige, at vi skriver et program, der vil opsende et rumskib. Sådan kan koden se ud:
|
Hvert sekund vil programmet vise et tal: 10 , derefter 9 , derefter 8 , osv. Når optællingen når 0 , vil programmet vise " Let's go! " |
2. Beregning af en pause korrekt
Længden af pausen er let at beregne. Hvis du skal bruge programmet til at gøre noget en gang i sekundet, så er pausen 1000 ms. Hvis 2 gange i sekundet, så pause i 500ms (1000/2).
Hvis du skal gøre noget 15 gange i sekundet, skal du holde pause i 66 ms (1000/15). Det hele virker ret ligetil:
The duration of one iteration of the loop = 1000 / number of times per second
Men der er en meget vigtig nuance her. Selvom mange udsagn udføres meget hurtigt, er de ikke øjeblikkelige.
Se det her. Lad os sige, at du har en handling, der tager 100 ms at fuldføre. Du ønsker at udføre denne handling 5 gange i sekundet. Hvor længe skal du holde pause? Absolut ikke 200ms.
For at handlingen skal udføres 5 gange i sekundet, skal den tid, der kræves til at udføre handlingen plus pausevarigheden, være lig med 200 ms. Hvis vi gør det, så kører den præcis 5 gange i sekundet. I vores tilfælde kræver handlingen 100 ms, hvilket betyder, at der stadig er 100 ms tilbage til pausen.
pause duration = duration of one iteration of the loop - time required to execute the action
Spiludviklere er godt klar over, at den tid, der kræves for at udføre en handling, er meget højere end nul. Og det er de mennesker, der spiller spil.
Hvis et spil kører med 20 FPS, betyder det, at det kun kan tegne 20 billeder på skærmen på et sekund. 1000/20
giver 50 ms. Dette er den tid, det tager at tegne en ramme, mens du spiller spillet.
3. Nanosekunder
Computere i dag er meget hurtigere, end da Java blev skabt. Det betyder, at en pause på 1 millisekund muligvis ikke er tilstrækkelig granulær.
Antag, at vi har en meget kort handling, som vi vil udføre 2000 gange i sekundet. Hvordan holder vi pause i et halvt millisekund?
Til dette er der endnu en variant af metoden Thread.sleep()
:
Thread.sleep(milliseconds, nanoseconds);
Denne metode sætter programmet i dvale i det angivne antal millisekunder og nanosekunder.
Nanosekunder er 1 milliontedel af et millisekund. Det betyder, at en pause på halvandet millisekund ville se sådan ud:
Thread.sleep(1, 500_000);
Og hvis du vil have en pause på 1/10
et millisekund, skal du skrive dette:
Thread.sleep(0, 100_000);
Du bruger muligvis ikke denne metode i dine programmer lige nu. Men det er bedre at vide om det og ikke bruge det, end at have brug for det og ikke vide om det.
4. TimeUnit
klasse
Java har i øvrigt en anden klasse, der vil gøre dit liv lettere, hvis du beslutter dig for at bremse din applikation. Vi taler om TimeUnit
klassen i java.util.concurrent
pakken.
Husk, at da klassen ikke er i java.lang
pakken, så skal du enten tilføje linjen import java.util.concurrent.TimeUnit;
eller skrive java.util.concurrent.TimeUnit
hver gang i din kode.
Denne klasse gør det samme som Thread.sleep()
, men det er mere praktisk:
TimeUnit.HOURS.sleep(15)
Denne kode sætter dit program i dvale i 15 timer. Minutter, sekunder, dage er også tilgængelige. Samt mikrosekunder (1/1000.000) og nanosekunder (1/1000.000.000).
Klassen TimeUnit
har følgende egenskaber:
- nanosekunder:
NANOSECONDS
- mikrosekunder:
MICROSECONDS
- millisekunder:
MILLISECONDS
- sekunder
SECONDS
- minutter:
MINUTES
- timer:
HOURS
- dage:
DAYS
Arbejdet med disse egenskaber er super bekvemt, da der ikke er behov for at tænke på at konvertere f.eks. timer til millisekunder. Sådan kode er meget mere behagelig at skrive og læse.
GO TO FULL VERSION