Wątek, który zostaje “uśpiony” metodą Thread.sleep()
, przestaje być wykonywany na określony czas, co pozwala na zarządzanie zasobami systemowymi oraz synchronizację zadań. Pytanie, które się nasuwa, dotyczy możliwości “obudzenia” takiego wątku przed upływem zdefiniowanego okresu oczekiwania. W tym artykule przyjrzymy się, czy jest to możliwe i jakie są do tego sposoby.
Przykład kodu
W poniższym przykładzie stworzymy prostą aplikację w Java, która demonstruje zarządzanie wątkami z wykorzystaniem metody Thread.sleep()
. Dodatkowo zobaczymy, jak można “przerwać” sen wątku, używając metody interrupt()
.
public class ThreadExample {
public static void main(String[] args) {
// Tworzenie nowego wątku
Thread sleeperThread = new Thread(() -> {
try {
// Wątek śpi przez 5 sekund
System.out.println("Wątek idzie spać na 5 sekund...");
Thread.sleep(5000);
System.out.println("Wątek obudził się samodzielnie po 5 sekundach");
} catch (InterruptedException e) {
// Wątek został przerwany podczas snu
System.out.println("Wątek został przerwany w trakcie snu");
}
});
// Startowanie wątku
sleeperThread.start();
// Przerwanie snu wątku po 2 sekundach
try {
Thread.sleep(2000); // Główny wątek śpi, czekając na moment przerwania
System.out.println("Przerwanie snu wątku...");
sleeperThread.interrupt();
} catch (InterruptedException e) {
System.out.println("Główny wątek został przerwany");
}
}
}
Opis działania kodu
- Tworzenie wątku: Definiujemy wątek
sleeperThread
, który wykonuje blok kodu w lambda wyrażeniu. - Sen wątku: Wątek planowany jest do uśpienia na 5 sekund.
- Wyjątek InterruptedException: Jeśli wątek zostanie przerwany podczas snu (np. przez inny wątek), wówczas zostanie rzucony wyjątek
InterruptedException
. - Startowanie i przerwanie wątku: Wątek jest startowany, a główny wątek czeka 2 sekundy, po czym przerwie sen
sleeperThread
używając metodyinterrupt()
.
Podsumowanie
Z przykładu wynika, że metoda Thread.sleep()
nie oferuje możliwości bezpośredniego “obudzenia” wątku przez inny mechanizm niż przerwanie. W praktyce, metoda interrupt()
może być używana do wcześniejszego zakończenia okresu uśpienia wątku, co jest istotne przy implementacji czułych na czas operacji. W odpowiedzi na pytanie: nie można “obudzić” wątku bezpośrednio, ale można go przerwać, co wymusza jego wcześniejsze “obudzenie”.
Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video Java w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.