Jason. Cała informatyka w jednym miejscu!

Programując wątki w języku Java, każdy z Was bez wyjątku musi pojąć jedną bardzo ważną rzecz dotyczącą samego ich usypiania. OK, wiemy już, że za pomocą statycznej metody "sleep" klasy "Thread", możemy oddziaływać na przebieg działania wątku po prostu go opóźniając o podaną liczbę milisekund. Natomiast jest jeden niuans domagający się wyjaśnień. Uśpienie wątku w języku Java też coś przed nami ukrywa. Serdecznie zapraszam do środka artykułu.

UŚPIENIE WĄTKU W JĘZYKU JAVA DAJE GWARANCJĘ TYLKO OD JEDNEJ STRONY!

Wspomniana metoda "sleep" staje się głównym bohaterem tego artykułu. Istotnie, pozwala wpłynąć na przebieg rywalizacji dwóch / więcej wątków, przez co w pewien sposób wymusza się pożądaną kolejność wykonywanych zadań. Czyli innymi słowy, wątek nie otrzyma pozwolenia na kontynuowanie swoich czynności, dopóki nie upłynie podany przez nas czas w milisekundach:

try {
	System.out.println("Piszę tekst od razu!");
	Thread.sleep(1000);
	System.out.println("Piszę tekst po sekundzie!");
}
catch (Exception e) {
	e.printStackTrace();
}

Dla ścisłości. Metoda "sleep" wymaga bloku "try-catch" do obsługi wyjątku "InterruptedException" (przypadek przerwania uśpienia poprzez wywołanie metody "interrupt").

A czy to znaczy również, że uśpiony wątek zostanie wyznaczony NATYCHMIAST po upłynięciu podanego czasu? Niekoniecznie! Może się zdarzyć, że wątek na którego nałożono opóźnienie zareaguje od razu po jego upłynięciu, a może być też tak, że dopiero po sekundzie, po dwóch czy po jeszcze jakimś opóźnieniu. Rozumiecie o co biega? Uśpienie wątku gwarantuje jedynie, że wątek nie będzie miał prawa "przejąć pałeczki" wcześniej niż wyznaczono w parametrze formalnym. Co nie znaczy, że mechanizm zarządzający wątkami przydzieli temu wątkowi prawo do działania zaraz po upłynięciu tego czasu.

Schemat usypiania wątku w języku Java

Usypiany wątek z pewnością pozostaje nieaktywny przez podaną liczbę milisekund, ale może być nieaktywny przez dłuższy czas z powodu różnych czynników.

Powtarzam jeszcze raz: "sleep" zapewni jedynie, że uśpienie wątku w języku Java nie będzie krótsze od podanego czasu, ale nie jest powiedziane, że natychmiast dostanie możliwość działania w ramach jakiejś "rekompensaty". Nie bardzo jest możliwym jakoś to zaprezentować na jakimkolwiek programie, gdyż aby ujrzeć wyraźne opóźnienie w wątku, trzeba by mocno obciążyć procesor gigantycznymi zadaniami.


Jaki z tego wniosek do serca? Nie uzależniać działania programu od metody "sleep", gdyż nie można dzięki jej działaniu "nagiąć" do samego końca przewidywalności działania wątków. To mechanizm zarządzający wątkami ukryty w maszynie wirtualnej, decyduje o tym ostatecznie.

PODOBNE ARTYKUŁY