CodeGym /Java-Blog /Random-DE /Thread.sleep()-Methode in Java
Autor
Artem Divertitto
Senior Android Developer at United Tech

Thread.sleep()-Methode in Java

Veröffentlicht in der Gruppe Random-DE
In Java-Programmen gibt es Situationen, in denen ein Thread zu schnell ausgeführt wird oder das Programm zu einem anderen Thread wechseln muss. Dazu müssen Sie die Ausführung des aktuellen Threads anhalten. In Java kann dies mit der Methode java.lang.Thread.sleep() erfolgen.

Thread.sleep()-Methode

Die Thread- Klasse ist im Java.lang-Paket vorhanden und enthält die Thread.sleep()- Methode. Die Java.lang.thread-Methode „sleep()“ wird verwendet, um den aktuellen Thread für eine bestimmte Zeit in Millisekunden anzuhalten. Wenn Sie sich die Oracle-Dokumente ansehen , werden Sie feststellen, dass es zwei überladene Sleep()- Methoden der Thread- Klasse gibt.

static void sleep(long millis)
Dabei ist Millis die Zeit in Millisekunden. Diese Methode bewirkt, dass der aktuell ausgeführte Thread für Millisekunden in den Ruhezustand versetzt wird (die Ausführung vorübergehend anhält, „schlafen“), abhängig von der Präzision der System-Timer und -Scheduler. Der Argumentwert für Millisekunden darf nicht negativ sein. Wenn ja, wird die IllegalArgumentException ausgelöst.

static void sleep(long millis, int nanos)
Dabei ist mills die Zeit in Millisekunden und nanos die Zeit in Nanosekunden. Diese Methodenvariante wird verwendet, um die Ausführung des aktuellen Threads für die genaue Zeit in Millisekunden und Nanosekunden anzuhalten. Der Nanosekundenwert ist zwischen 0 und 999999 gültig. Erstellen wir ein einfaches Programm, das die Thread.sleep()- Methode verwendet, um die Ausführung des Hauptthreads für 5 Sekunden anzuhalten:

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");
       }
}
Was passiert in diesem Programm? Zuerst startet es, dann schläft es für 5 Millisekunden (5 Sekunden), dann gibt es auf der Konsole eine Meldung aus, wie lange es eingefroren war, und wird dann beendet. Die Ausgabe ist:
Der Thread wird für 5008 Millisekunden angehalten
Wie Sie sehen, pausierte das Programm nicht 5 Sekunden, sondern etwas länger. Wenn Sie das Programm auf Ihrem Computer ausführen, werden Sie außerdem feststellen, dass es die Ausführung des Threads für länger als 5000 Millisekunden und nicht unbedingt für 5008 Millisekunden stoppen kann. Der Punkt ist, dass alles vom Betriebssystem und der spezifischen Implementierung des Thread-Schedulers abhängt. Genauer gesagt hängt die tatsächliche Zeit, die ein Thread wartet, bevor er aufwacht und mit der Ausführung beginnt, von den System-Timern und -Schedulern ab. Bei einem ruhigen System liegt die tatsächliche Ruhezeit nahe an der angegebenen Ruhezeit, bei einem ausgelasteten System ist sie jedoch etwas länger. Diese Methode wird häufig in untergeordneten Threads verwendet, wenn Sie ständig, aber nicht zu oft, eine Aktion ausführen müssen. Hier ist ein Beispiel für ein Programm, das jede Sekunde eine Nachricht ausgibt und nie beendet wird:

public class SleepDemo1 {

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

Wichtige Punkte von Java Thread Sleep

Es ist wichtig, sich daran zu erinnern, dass die Java Thread Sleep- Methode folgendermaßen funktioniert:
  • Es unterbricht immer die Ausführung des aktuellen Threads.

  • Der eigentliche Thread schläft, bis er aufwacht, und die Ausführungszeit hängt von den System-Timern und -Schedulern ab.

  • Der schlafende Thread blockiert nicht den aktuellen Thread.

  • Jeder andere Thread kann den aktuell schlafenden Thread unterbrechen. In diesem Fall wird eine InterruptedException ausgelöst.

  • Der Argumentwert für Millisekunden darf nicht negativ sein, andernfalls wird eine IllegalArgumentException ausgelöst.

Um ein Beispiel für das Auslösen einer IllegalArgumentException zu geben , modifizieren Sie einfach das obige Programm ein wenig:

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");
       }
}
Hier ist die Ausgabe:
Ausnahme im Thread „main“ java.lang.IllegalArgumentException: Der Timeout-Wert ist negativ bei java.base/java.lang.Thread.sleep(Native Method) bei SleepDemo.main(SleepDemo.java:7)
Oben haben wir den Hauptthread in den Ruhezustand versetzt. Versuchen wir nun, die Methode auf einen anderen Thread anzuwenden.

// 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();
       }
}
Die Ausgabe ist:
0 1 2 3 4 5 6 7 8 9
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION