[ Pobierz całość w formacie PDF ]
wiązanie takie nie jest jednak zalecane. Należy dążyć do oddzielenia wykonywanego
zadania od mechanizmu jego wykonywania. W sytuacji, gdy musimy wykonać dużą licz-
bę zadań, tworzenie wątku dla każdego z nich jest zbyt kosztowne i lepiej jest wykorzy-
stać pulę wątków (patrz strona 83.).
Nie należy wywoływać bezpośrednio metody zostanie ona wywołana przez me-
todę , w momencie gdy wątek jest gotowy do rozpoczęcia działania. Bezpośred-
nie wywołanie metody spowoduje jej wykonanie w bieżącym wątku zamiast utwo-
rzenia nowego.
Listing 1.2 zawiera kompletny kod animacji wielowątkowej.
Listing 1.2. BounceThread.java
26 Java 2. Techniki zaawans0wane
R0zdział 1. Wiel0wątk0w0ść 27
28 Java 2. Techniki zaawans0wane
R0zdział 1. Wiel0wątk0w0ść 29
tworzy nowy wątek, który wykonywać będzie metodę
run obiektu .
uruchamia ten wątek i powoduje wywołanie metody . Metoda
oddaje natychmiast sterowanie do metody, która ją wywołała, a nowy wątek
wykonywany jest równolegle.
wywołuje metodę odpowiedniego obiektu implementującego
interfejs .
tę metodę należy zastąpić własną wersją zawierającą kod, który ma
być wykonywany w nowym wątku.
Przerywanie wątków
Wykonanie wątku kończy się w momencie, gdy metoda zwraca sterowanie. (W pierw-
szej wersji języka Java istniała także metoda , za pomocą której jeden wątek mógł za-
kończyć wykonywanie innego. Obecnie metoda ta nie jest stosowana, a przyczyny tego
omówimy w dalszej części rozdziału).
30 Java 2. Techniki zaawans0wane
Obecnie nie istnieje więc sposób, aby wymusić zakończenie wątku. Można jednak zażądać
zakończenia wątku za pomocą metody .
Wywołanie metody powoduje nadanie wątkowi statusu przerwania. Status ten
jest reprezentowany za pomocą znacznika logicznego. Wartość tego znacznika powinna
być okresowo sprawdzana przez wątek.
Aby sprawdzić status przerwania wątku, należy najpierw wywołać metodę statyczną
, aby uzyskać bieżący wątek, a następnie wywołać metodę
sprawdzającą jego status:
T T
Jednak wątek, którego wykonywanie zostało zablokowane, nie może sprawdzić własnego
statusu przerwania. I właśnie w takim przypadku pomocny jest wyjątek
. Jeśli metoda zostanie wywołana dla wątku, którego wykonanie jest zablo-
kowane, to blokująca go metoda lub zostanie przerwana i pojawi się wyjątek
.
Zrodowisko języka Java nie wymaga wcale, aby wątek przerwany w taki sposób zakończył
swoje wykonywanie. Przerwanie wątku sygnalizuje jedynie pojawienie się pewnego żąda-
nia. Przerwany wątek sam decyduje, w jaki sposób zareagować na takie żądanie. Wykona-
nie niektórych wątków w programie może być na tyle ważne, że po prostu zignorują one
wyjątek i kontynuować będą swoje działanie. Najczęściej jednak wątek zinterpretuje wyją-
tek jako żądanie zakończenia wykonywania. Metoda takiego wątku wygląda wtedy na-
stępująco:
Sprawdzenie statusu przerwania wątku za pomocą metody nie jest konieczne,
gdy metoda wywoływana jest po każdej iteracji przetwarzania. Gdy wątek posiada
status przerwania, to wywołanie metody spowoduje wystąpienie wyjątku
R0zdział 1. Wiel0wątk0w0ść 31
. Dlatego też, gdy metoda wywoływana jest w pętli, to nie musimy
sprawdzać statusu przerwania wątku. Wystarczy jedynie zająć się obsługą wyjątku
. Metoda posiada wtedy następującą postać:
Wygenerowanie wyjątku przez metodę kasuje status
przerwania wątku.
Istnieją dwie podobne metody, oraz . Metoda
jest statyczną metodą, która sprawdza, czy bieżący wątek został przerwany. Dodatko-
wo wywołanie metody kasuje status przerwania wątku. Natomiast me-
toda wywoływana jest dla konkretnej instancji wątku i umożliwia sprawdze-
nie statusu przerwania dowolnego wątku. Jej wywołanie nie zmienia tego statusu.
Często można spotkać fragmenty kodu, w których obsługa wystąpienia wyjątku
jest pominięta, co widać poniżej:
Nie wolno pisać programów w ten sposób! Jeśli nie wiemy, jak obsłużyć wyjątek w klau-
zuli , to zawsze mamy jeszcze dwie inne możliwości:
W klauzuli wywołać w celu nadania
wątkowi statusu przerwania, który może być sprawdzony przez kod wywołujący.
32 Java 2. Techniki zaawans0wane
Lepsze rozwiązanie polega na zadeklarowaniu metody jako
i pominięciu bloku . Dzięki temu kod wywołujący
metodę (lub w końcu sama metoda ) będzie mógł obsłużyć wyjątek.
wysyła żądanie przerwania wątku. Status przerwania wątku
przyjmuje wtedy wartość . Jeśli wykonanie wątku jest zablokowane przez
wywołanie metody lub , to występuje wyjątek .
[ Pobierz całość w formacie PDF ]