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
sleeperThreaduż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.

