1.Thread.sleep()

È possibile inserire pause nell'esecuzione di un programma Java. Questo di solito non è necessario, poiché gli utenti desiderano che i loro programmi vengano eseguiti il ​​più rapidamente possibile. Non molte persone sarebbero felici se rallentassi deliberatamente il tuo codice.

Ma come programmatore, ci possono essere tantissime situazioni in cui una pausa nel tuo codice sarà utile. Ad esempio, supponi di scrivere un gioco e di volerlo fare qualcosa una volta ogni due secondi o più volte al secondo.

Fondamentalmente, le pause sono utili, quindi vediamo come aggiungere una pausa al tuo codice. In realtà è molto semplice:

Thread.sleep(duration);

Dove duration è la lunghezza della pausa in millisecondi ( 1/1000di secondo).

Questa istruzione metterà in pausa il tuo programma per duration millisecondi. Esempi:

Thread.sleep(2000);
Mette in pausa il programma per 2 secondi.
Thread.sleep(500);
Mette in pausa il programma per mezzo secondo.
Thread.sleep(60 * 60 * 1000);
Mette in pausa il programma per 1 ora.

Ecco come può essere utilizzato in pratica. Diciamo che stiamo scrivendo un programma che lancerà un'astronave. Ecco come potrebbe apparire il codice:

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

System.out.println("Let's go!");
Ogni secondo, il programma visualizzerà un numero: 10, quindi 9, quindi 8, ecc.




Quando il conteggio raggiunge 0, il programma visualizzerà " Let's go!"

2. Calcolare correttamente una pausa

La durata della pausa è facile da calcolare. Se hai bisogno che il programma faccia qualcosa una volta al secondo, allora la pausa è di 1000 ms. Se 2 volte al secondo, mettere in pausa per 500 ms (1000/2).

Se devi fare qualcosa 15 volte al secondo, metti in pausa per 66 ms (1000/15). Sembra tutto piuttosto semplice:

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

Ma qui c'è una sfumatura molto importante. Sebbene molte istruzioni vengano eseguite molto rapidamente, non sono istantanee.

Guarda questo. Supponiamo che tu abbia un'azione che richiede 100 ms per essere completata. Vuoi eseguire questa azione 5 volte al secondo. Quanto tempo dovresti mettere in pausa? Sicuramente non 200 ms.

Affinché l'azione venga eseguita 5 volte al secondo, è necessario che il tempo necessario per eseguire l'azione più la durata della pausa sia pari a 200 ms. Se lo facciamo, verrà eseguito esattamente 5 volte al secondo. Nel nostro caso, l'azione richiede 100 ms, il che significa che rimangono ancora 100 ms per la pausa.

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

Gli sviluppatori di giochi sono ben consapevoli del fatto che il tempo necessario per eseguire un'azione è molto superiore a zero. E lo sono anche le persone che giocano.

Se un gioco gira a 20 FPS, significa che può disegnare solo 20 fotogrammi sullo schermo in un secondo. 1000/20produce 50 ms. Questo è il tempo necessario per disegnare una cornice durante il gioco.



3. Nanosecondi

I computer oggi sono molto più veloci rispetto a quando è stato creato Java. Ciò significa che una pausa di 1 millisecondo potrebbe non essere sufficientemente granulare.

Supponiamo di avere un'azione super breve che vogliamo eseguire 2000 volte al secondo. Come ci fermiamo per mezzo millisecondo?

Per questo, c'è un'altra variante del Thread.sleep()metodo:

Thread.sleep(milliseconds, nanoseconds);

Questo metodo mette il programma in sospensione per la quantità specificata di millisecondi e nanosecondi.

I nanosecondi sono 1 milionesimo di millisecondo. Ciò significa che una pausa di un millisecondo e mezzo sarebbe simile a questa:

Thread.sleep(1, 500_000);

E se vuoi una pausa di 1/10un millisecondo, devi scrivere questo:

Thread.sleep(0, 100_000);

Potresti non utilizzare questo metodo nei tuoi programmi in questo momento. Ma è meglio saperlo e non usarlo piuttosto che averne bisogno e non saperlo.



4. TimeUnitclasse

A proposito, Java ha un'altra classe che ti semplificherà la vita se decidi di rallentare la tua applicazione. Stiamo parlando della TimeUnitclasse nel java.util.concurrentpacchetto.

Ricorda che poiché la classe non è nel java.langpacchetto, devi aggiungere la riga import java.util.concurrent.TimeUnit;o scrivere java.util.concurrent.TimeUnitogni volta nel tuo codice.

Questa classe fa la stessa cosa di Thread.sleep(), ma è più conveniente:

TimeUnit.HOURS.sleep(15)

Questo codice metterà il tuo programma in stop per 15 ore. Sono disponibili anche minuti, secondi, giorni. Oltre a microsecondi (1/1000.000) e nanosecondi (1/1000.000.000).

La TimeUnit classe ha le seguenti proprietà:

  • nanosecondi:NANOSECONDS
  • microsecondi:MICROSECONDS
  • millisecondi:MILLISECONDS
  • secondiSECONDS
  • minuti:MINUTES
  • ore:HOURS
  • giorni:DAYS

Lavorare con queste proprietà è super conveniente, poiché non è necessario pensare a convertire, diciamo, ore in millisecondi. Tale codice è molto più piacevole da scrivere e leggere.

Maggiori dettagli possono essere letti qui .