1.Thread.sleep()

Du kan sette inn pauser i kjøringen av et Java-program. Dette er vanligvis ikke nødvendig, siden brukere vil at programmene deres skal kjøre så raskt som mulig. Ikke mange mennesker ville vært glade hvis du bevisst bremset koden din.

Men som programmerer kan det være mange situasjoner der en pause i koden din vil være nyttig. Anta for eksempel at du skriver et spill og du vil at det skal gjøre noe annethvert sekund eller flere ganger i sekundet.

I utgangspunktet er pauser nyttige, så la oss se hvordan du legger til en pause i koden din. Det er faktisk veldig enkelt:

Thread.sleep(duration);

Hvor duration er lengden på pausen i millisekunder ( 1/1000av et sekund).

Denne uttalelsen vil sette programmet på pause i duration millisekunder. Eksempler:

Thread.sleep(2000);
Setter programmet på pause i 2 sekunder.
Thread.sleep(500);
Setter programmet på pause i et halvt sekund.
Thread.sleep(60 * 60 * 1000);
Setter programmet på pause i 1 time.

Her er hvordan det kan brukes i praksis. La oss si at vi skriver et program som vil lansere et romskip. Slik kan koden se ut:

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

System.out.println("Let's go!");
Hvert sekund vil programmet vise et tall: 10, deretter 9, deretter 8, osv.




Når tellingen når 0, vil programmet vise " Let's go!"

2. Beregn en pause riktig

Lengden på pausen er enkel å beregne. Hvis du trenger at programmet skal gjøre noe en gang i sekundet, er pausen 1000 ms. Hvis 2 ganger per sekund, pauser du i 500ms (1000/2).

Hvis du trenger å gjøre noe 15 ganger per sekund, pause i 66 ms (1000/15). Det hele virker ganske enkelt:

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

Men det er en veldig viktig nyanse her. Selv om mange utsagn utføres veldig raskt, er de ikke øyeblikkelige.

Se på dette. La oss si at du har en handling som tar 100 ms å fullføre. Du vil utføre denne handlingen 5 ganger per sekund. Hvor lenge bør du pause? Definitivt ikke 200ms.

For at handlingen skal utføres 5 ganger per sekund, trenger vi at tiden som kreves for å utføre handlingen pluss pausevarigheten er lik 200 ms. Hvis vi gjør det, vil den kjøre nøyaktig 5 ganger per sekund. I vårt tilfelle krever handlingen 100 ms, noe som betyr at det fortsatt er 100 ms igjen til pausen.

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

Spillutviklere er godt klar over det faktum at tiden som kreves for å utføre en handling er mye høyere enn null. Og det samme er menneskene som spiller spill.

Hvis et spill kjører med 20 FPS, betyr det at det kun kan tegne 20 bilder på skjermen i løpet av ett sekund. 1000/20gir 50 ms. Dette er tiden det tar å tegne en ramme mens du spiller spillet.



3. Nanosekunder

Datamaskiner i dag er mye raskere enn da Java ble opprettet. Det betyr at en pause på 1 millisekund kanskje ikke er tilstrekkelig granulær.

Anta at vi har en superkort handling som vi ønsker å utføre 2000 ganger per sekund. Hvordan tar vi pause i et halvt millisekund?

For dette er det en annen variant av Thread.sleep()metoden:

Thread.sleep(milliseconds, nanoseconds);

Denne metoden setter programmet i dvale i den angitte mengden millisekunder og nanosekunder.

Nanosekunder er 1 milliondels millisekund. Det betyr at en pause på halvannet millisekund vil se slik ut:

Thread.sleep(1, 500_000);

Og hvis du vil ha en pause på 1/10et millisekund, må du skrive dette:

Thread.sleep(0, 100_000);

Du bruker kanskje ikke denne metoden i programmene dine akkurat nå. Men det er bedre å vite om det og ikke bruke det enn å trenge det og ikke vite om det.



4. TimeUnitklasse

Java har forresten en annen klasse som vil gjøre livet ditt enklere hvis du bestemmer deg for å bremse applikasjonen. Vi snakker om TimeUnitklassen i java.util.concurrentpakken.

Husk at siden klassen ikke er i pakken java.lang, må du enten legge til linjen import java.util.concurrent.TimeUnit;eller skrive java.util.concurrent.TimeUnithver gang i koden din.

Denne klassen gjør det samme som Thread.sleep(), men det er mer praktisk:

TimeUnit.HOURS.sleep(15)

Denne koden vil sette programmet i dvale i 15 timer. Minutter, sekunder, dager er også tilgjengelige. Samt mikrosekunder (1/1000 000) og nanosekunder (1/1000 000 000).

Klassen TimeUnit har følgende egenskaper:

  • nanosekunder:NANOSECONDS
  • mikrosekunder:MICROSECONDS
  • millisekunder:MILLISECONDS
  • sekunderSECONDS
  • minutter:MINUTES
  • timer:HOURS
  • dager:DAYS

Arbeid med disse egenskapene er super praktisk, siden det ikke er nødvendig å tenke på å konvertere for eksempel timer til millisekunder. Slik kode er mye mer behagelig å skrive og lese.

Flere detaljer kan leses her .