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 .
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
GO TO FULL VERSION