[ Pobierz całość w formacie PDF ]
nownie aktywowany (ponieważ upłynął okres czasu, na który zawiesił on swoje wykonywa-
nie bądz zakończyła się blokująca go operacja wejścia-wyjścia), program szeregujący wątki
sprawdza, czy posiada on priorytet wyższy od aktualnie wykonywanego wątku. Jeśli tak, to
wywłaszcza bieżący wątek i rozpoczyna wykonywanie reaktywowanego wątku.
Rysunek 1.3.
Diagram
stanów wątku
Wątek może powrócić ze stanu zablokowanego do stanu wykonywalnego, przebywając na
diagramie jedną z następujących dróg.
1. Jeśli wątek zawiesił wykonywanie wywołując metodę , musi upłynąć
określona liczba milisekund.
2. Jeśli wątek został zablokowany przez operację wejścia-wyjścia, to musi ona się
zakończyć.
3. Jeśli wątek zamierza uzyskać blokadę obiektu posiadaną przez inny wątek,
to wątek ten musi zrzec się blokady obiektu. (Możliwe jest również oczekiwanie
na zwolnienie blokady z określonym limitem czasu. Wtedy wątek zostaje
odblokowany po jego upływie).
4. Jeśli wątek oczekuje na spełnienie pewnego warunku, to jego zajście musi
zostać zasygnalizowane przez inny wątek. (Możliwe jest również oczekiwanie
na spełnienie warunku z określonym limitem czasu. Wtedy wątek zostaje
odblokowany po jego upływie).
5. Jeśli wątek zawiesił swoje wykonywanie, to inny wątek musi wywołać jego metodę
. Stosowanie metod i nie jest jednak zalecane.
R0zdział 1. Wiel0wątk0w0ść 35
Zablokowany wątek może powrócić do stanu wykonywalnego jedynie tą samą drogą, na
której został zablokowany. W szczególności nie wystarczy wywołanie metody , aby
odblokować wątek.
Dla odblokowania operacji wejścia i wyjścia należy stosować mechanizm kanałów ofe-
rowany przez nową bibliotekę wejścia i wyjścia. Gdy inny wątek zamyka kanał, to za-
blokowany wÄ…tek powraca do stanu wykonywalnego, a blokujÄ…ca operacja generuje wy-
jÄ…tek .
WÄ…tki martwe
Wątek może być martwy gdy zaistnieje jeden z dwóch powodów.
Zakończy się wykonywanie metody w prawidłowy sposób.
Wykonanie metody zostanie przerwane ze względu na wystąpienie wątku,
którego metoda ta nie obsługuje.
W szczególności możliwe jest zabicie wątku przez wywołanie metody . Powoduje
ona wystąpienie błędu , co kończy wykonywanie wątku. Metoda ta niesie ze
sobą pewne zagrożenia (omówimy je w dalszej części rozdziału) i nie powinna być stoso-
wana w programach.
Aby uzyskać informację o tym, czy dany wątek żyje (czyli jest wykonywalny lub zablo-
kowany), stosujemy metodę . Zwraca ona wartość logiczną , gdy wątek jest
wykonywalny lub zablokowany albo wartość , jeśli jest nowy bądz martwy.
Nie można uzyskać informacji o tym, czy dany wątek jest wykonywalny, czy też zablo-
kowany, a także informacji o tym, czy jest w danej chwili wykonywany. Podobnie nie
można rozróżnić stanu wątku, w którym nie jest on jeszcze wykonywalny, od stanu,
w którym jest już martwy.
zwraca wartość , jeśli wątek już rozpoczął działanie
i jeszcze się nie zakończył.
kończy wykonanie wątku. Użycie tej metody nie jest zalecane.
zawiesza wykonanie wątku. Użycie tej metody nie jest zalecane.
podejmuje wykonanie wÄ…tku zawieszonego metodÄ… .
Użycie obu metod nie jest zalecane.
oczekuje zakończenia działania określonego wątku.
oczekuje zakończenia działania określonego wątku
lub upływu milisekund.
36 Java 2. Techniki zaawans0wane
Właściwości wątków
W kolejnych punktach omówione zostaną inne właściwości wątków: priorytety, wątki-
demony, grupy wątków i domyślne procedury obsługi wyjątków.
Pri0rytety wątków
W języku Java z każdym wątkiem związany jest określony priorytet. Domyślnie wątek dzie-
dziczy priorytet po swoim wątku nadrzędnym, czyli wątku, który go utworzył. Można go jed-
nak zmniejszyć lub zwiększyć, stosując metodę . Za jej pomocą można prioryte-
towi nadać dowolną wartość z przedziału od (zdefiniowane jako 1 w klasie
) do (zdefiniowane jako 10). Priorytet posiada wartość 5.
Gdy program szeregowania wątków musi wybrać nowy wątek, zawsze wybiera wątek wy-
konywalny o najwyższym priorytecie. Należy zaznaczyć, że wszelkie zasady działania zwią-
zane z priorytetami wątków są w znacznym stopniu zależne od konkretnego systemu opera-
cyjnego. Jeśli maszyna wirtualna języka Java wykorzystuje zarządzanie wątkami danej
platformy, to musi dokonać odwzorowania priorytetów wątków zdefiniowanych w języku
Java na poziomy priorytetów tej platformy (których może być mniej lub więcej niż wartości
priorytetów w języku Java).
Na przykład w systemie Windows NT/XP istnieje siedem poziomów priorytetów, mniej niż
definiuje to Java. Niezależnie więc od sposobu odwzorowanie priorytetów zdarzać się będzie,
że wątki, które mają różny priorytet w języku Java, będą posiadać w rzeczywistości ten sam
priorytet z punktu widzenia systemu operacyjnego. W przypadku maszyny wirtualnej Java
firmy Sun dla systemu Linux informacja o priorytetach wątków jest w ogóle ignorowana.
Z tego powodu należy traktować priorytety wątków jedynie jako rodzaj wskazówki dla
programu szeregującego. W żadnym wypadku nie należy tworzyć programów, których po-
prawne działanie zależy od poziomów priorytetów.
Jeśli zamierzasz używać priorytetów wątków, to powinieneś wiedzieć o błędzie popeł-
nianym często przez początkujących. Jeśli w programie istnieje kilka wątków o wyso-
kim priorytecie, które rzadko znajdują się w stanie zablokowanym, to mogą one unie-
[ Pobierz całość w formacie PDF ]