CodeGym /Blog Java /Random-PL /Metoda Thread.sleep() w Javie
Autor
Artem Divertitto
Senior Android Developer at United Tech

Metoda Thread.sleep() w Javie

Opublikowano w grupie Random-PL
W programach Java zdarzają się sytuacje, gdy wątek jest wykonywany zbyt szybko lub program musi przełączyć się na inny wątek. Aby to zrobić, musisz zawiesić wykonywanie bieżącego wątku. W Javie można to zrobić za pomocą metody java.lang.Thread.sleep() .

Metoda Thread.sleep().

Klasa Thread jest obecna w pakiecie Java.lang i zawiera metodę Thread.sleep() . Metoda Java.lang.thread sleep() służy do zawieszenia bieżącego wątku na określony czas w milisekundach. Jeśli spojrzysz na dokumentację Oracle , zauważysz, że istnieją dwie przeciążone metody sleep() klasy Thread .

static void sleep(long millis)
gdzie milis to czas w milisekundach. Ta metoda powoduje, że aktualnie wykonywany wątek przechodzi w stan uśpienia (tymczasowe zatrzymanie wykonywania, „uśpienie”) na milisekundy, w zależności od precyzji timerów systemowych i harmonogramów. Wartość argumentu dla milisekund nie może być ujemna. Jeśli tak, zostanie zgłoszony wyjątek IllegalArgumentException .

static void sleep(long millis, int nanos)
gdzie młyny to czas w milisekundach, a nanos to czas w nanosekundach. Ten wariant metody służy do wstrzymania wykonywania bieżącego wątku na dokładny czas w milisekundach i nanosekundach. Wartość w nanosekundach mieści się w przedziale od 0 do 999999. Stwórzmy prosty program, który używa metody Thread.sleep() do wstrzymania wykonywania głównego wątku na 5 sekund:

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");
       }
}
Co się dzieje w tym programie? Najpierw się uruchamia, potem śpi przez 5 milisekund (5 sekund), następnie drukuje na konsoli komunikat o tym, jak długo był zamrożony, a następnie wychodzi. Dane wyjściowe to:
Wątek jest wstrzymany na 5008 milisekund
Jak widać, program nie zatrzymał się na 5 sekund, ale trochę dłużej. Również jeśli uruchomisz program na swoim komputerze, zauważysz, że może on zatrzymać wykonywanie wątku na dłużej niż 5000 milisekund i nie jest to konieczne przez 5008 milisekund. Rzecz w tym, że wszystko zależy od systemu operacyjnego i konkretnej implementacji harmonogramu wątków. Bardziej szczegółowo, rzeczywisty czas oczekiwania wątku przed przebudzeniem i rozpoczęciem wykonywania zależy od timerów systemowych i harmonogramów. W przypadku cichego systemu rzeczywisty czas uśpienia jest zbliżony do określonego czasu uśpienia, ale w przypadku obciążonego systemu będzie nieco dłuższy. Ta metoda jest często używana w wątkach potomnych, gdy musisz cały czas wykonywać jakąś akcję, ale niezbyt często. Oto przykład programu, który będzie wyświetlał komunikat co sekundę i nigdy nie wychodził:

public class SleepDemo1 {

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

Ważne punkty uśpienia wątku Java

Należy pamiętać, że metoda Java Thread Sleep działa w taki sposób, że:
  • Zawsze wstrzymuje wykonywanie bieżącego wątku.

  • Rzeczywisty wątek śpi, dopóki się nie obudzi, a czas wykonania zależy od timerów systemowych i harmonogramów.

  • Wątek uśpiony nie blokuje bieżącego wątku.

  • Każdy inny wątek może przerwać bieżący uśpiony wątek, w którym to przypadku zgłaszany jest wyjątek InterruptedException .

  • Wartość argumentu dla milisekund nie może być ujemna, w przeciwnym razie zostanie zgłoszony wyjątek IllegalArgumentException .

Aby podać przykład rzucania wyjątku IllegalArgumentException , wystarczy nieco zmodyfikować powyższy program:

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");
       }
}
Oto dane wyjściowe:
Wyjątek w wątku „main” java.lang.IllegalArgumentException: wartość limitu czasu jest ujemna w java.base/java.lang.Thread.sleep (metoda natywna) w SleepDemo.main (SleepDemo.java: 7)
Powyżej uśpiliśmy wątek główny. Teraz spróbujmy zastosować tę metodę do innego wątku.

// 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();
       }
}
Dane wyjściowe to:
0 1 2 3 4 5 6 7 8 9
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION