Czy możemy obudzić wątek, który został uśpiony za pomocą metody Thread.sleep() w Java?

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

  1. Tworzenie wątku: Definiujemy wątek sleeperThread, który wykonuje blok kodu w lambda wyrażeniu.
  2. Sen wątku: Wątek planowany jest do uśpienia na 5 sekund.
  3. Wyjątek InterruptedException: Jeśli wątek zostanie przerwany podczas snu (np. przez inny wątek), wówczas zostanie rzucony wyjątek InterruptedException.
  4. 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 metody interrupt().

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.

Scroll to Top