CodeGym /Java Blog /Random-IT /Metodo Thread.sleep() in Java
John Squirrels
Livello 41
San Francisco

Metodo Thread.sleep() in Java

Pubblicato nel gruppo Random-IT
Nei programmi Java, ci sono situazioni in cui un thread viene eseguito troppo velocemente o il programma deve passare a un altro thread. Per fare ciò, è necessario sospendere l'esecuzione del thread corrente. In Java, questo può essere fatto usando il metodo java.lang.Thread.sleep() .

Metodo Thread.sleep()

La classe Thread è presente nel pacchetto Java.lang e contiene il metodo Thread.sleep() . Il metodo Java.lang.thread sleep() viene utilizzato per sospendere il thread corrente per un periodo di tempo specificato in millisecondi. Se guardi Oracle docs , scoprirai che ci sono due metodi sleep() sovraccarichi della classe Thread .

static void sleep(long millis)
dove millis è il tempo in millisecondi. Questo metodo fa sì che il thread attualmente in esecuzione sospenda (interrompe temporaneamente l'esecuzione, "dormire") per millisecondi, a seconda della precisione dei timer e degli scheduler di sistema. Il valore dell'argomento per i millisecondi non può essere negativo. In tal caso, verrà lanciata IllegalArgumentException .

static void sleep(long millis, int nanos)
dove macina il tempo in millisecondi e nanos è il tempo in nanosecondi. Questa variante del metodo viene utilizzata per sospendere l'esecuzione del thread corrente per il tempo esatto in millisecondi e nanosecondi. Il valore del nanosecondo è valido tra 0 e 999999. Creiamo un semplice programma che utilizzi il metodo Thread.sleep() per sospendere l'esecuzione del thread principale per 5 secondi:

public class SleepDemo {

       public static void main(String[] args) throws InterruptedException {
           //the current time in milliseconds
           long start = System.currentTimeMillis();
           // stop the main thread of the program for 5000 milliseconds (5 seconds)
           Thread.sleep(5000);
           System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " milliseconds");
       }
}
Cosa sta succedendo in questo programma? Prima si avvia, poi rimane inattivo per 5 millisecondi (5 secondi), quindi stampa sulla console un messaggio su quanto tempo è rimasto bloccato, quindi esce. L'uscita è:
Il thread viene messo in pausa per 5008 millisecondi
Come puoi vedere, il programma non si è fermato per 5 secondi, ma un po' di più. Inoltre, se esegui il programma sul tuo computer, noterai che potrebbe interrompere l'esecuzione del thread per più di 5000 millisecondi e non necessario per 5008 millisecondi. Il punto è che tutto dipende dal sistema operativo e dall'implementazione specifica del thread scheduler. Più in dettaglio, il tempo effettivo che un thread attende prima di risvegliarsi e iniziare l'esecuzione dipende dai timer e dagli scheduler di sistema. Per un sistema silenzioso, il tempo di sospensione effettivo è vicino al tempo di sospensione specificato, ma per un sistema carico sarà leggermente più lungo. Questo metodo viene spesso utilizzato nei thread figlio quando è necessario eseguire un'azione tutto il tempo, ma non troppo spesso. Ecco un esempio di un programma che stamperà un messaggio ogni secondo e non uscirà mai:

public class SleepDemo1 {

   public static void main(String[] args) throws InterruptedException {
       while (true)
       {
           Thread.sleep(1000);
           System.out.println("One more second");
       }
   }
}

Punti importanti di Java Thread Sleep

È importante ricordare che il metodo Java Thread Sleep funziona in modo tale che:
  • Sospende sempre l'esecuzione del thread corrente.

  • Il thread effettivo dorme fino a quando non si sveglia e il tempo di esecuzione dipende dai timer e dagli scheduler di sistema.

  • Il thread dormiente non blocca il thread corrente.

  • Qualsiasi altro thread può interrompere il thread dormiente corrente, nel qual caso viene generata un'eccezione InterruptedException .

  • Il valore dell'argomento per i millisecondi non può essere negativo, altrimenti verrà generata un'eccezione IllegalArgumentException .

Per fare un esempio di lancio di una IllegalArgumentException , basta modificare un po 'il programma sopra:

public class SleepDemo1 {

       public static void main(String[] args) throws InterruptedException {
           //the current time in milliseconds
           long start = System.currentTimeMillis();
           // stop the main thread of the program for 5000 milliseconds (5 seconds)
           Thread.sleep(-5000);
           System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " ms");
       }
}
Ecco l'output:
Eccezione nel thread "main" java.lang.IllegalArgumentException: il valore di timeout è negativo in java.base/java.lang.Thread.sleep(metodo nativo) in SleepDemo.main(SleepDemo.java:7)
Sopra mettiamo a dormire il thread principale. Ora proviamo ad applicare il metodo a qualche altro thread.

// Java Program to sleep the custom thread
public class SleepDemo2 extends Thread{

       public void run()
       {
           // thread 0
           try {
               for (int i = 0; i < 10; i++) {

                   // sleeps the main thread for about 2 seconds
                   Thread.sleep(2000);
                   System.out.println(i);
               }
           }
           catch (Exception e) {

               // catching the exception
               System.out.println(e);
           }
       }
       public static void main(String[] args)
       {
           SleepDemo2 sleepDemo2 = new SleepDemo2();
           sleepDemo2.start();
       }
}
L'uscita è:
0 1 2 3 4 5 6 7 8 9
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION