[ Pobierz całość w formacie PDF ]

TickTock, tt w tym przypadku. Wewn trz metody run() klasy MyThread wywo ana zostaje
metoda tick(), je li nazw w tku jest "tik". Je li nazw jest "tak", wywo ana zostaje metoda
tock(). Ka da z tych metod zostaje wywo ana pi razy z argumentem true. Ostatnie wywo a-
nie przekazuje ka dej metodzie argument false, co powoduje zatrzymanie symulacji zegara.
Najwa niejsz cz symulacji zegara stanowi metody tick() i tock() klasy TickTock. Przyj-
rzyjmy si metodzie tick(), której kod przedstawi em poni ej.
Poleć książkę
Kup książkę
390 Java. Przewodnik dla pocz tkuj cych
synchronized void tick(boolean running) {
if(!running) { // zatrzymuje zegar
state = "ticked";
notify(); // powiadamia oczekuj cy w tek
return;
}
System.out.print("tik ");
state = "ticked"; // zmienia stan zegara na "ticked"
notify(); // umo liwia wykonanie metody tock()
try {
while(!state.equals("tocked"))
wait(); // oczekuje na zako czenie metody tock()
}
catch(InterruptedException exc) {
System.out.println("W tek zosta przerwany.");
}
}
Zwró uwag , e metoda tick() zosta a zadeklarowana jako synchronized. Jak ju wspo-
mnia em, metody wait() i notify() znajduj zastosowanie tylko w przypadku synchronizacji
dost pu do metod. Metoda rozpoczyna dzia anie od sprawdzenia warto ci parametru running.
Parametr ten jest u ywany do zako czenia dzia ania symulacji zegara. Je li ma warto false,
zegar zostaje zatrzymany. W takim przypadku sk adowa state otrzymuje warto "ticked"
i wywo ana zostaje metoda notify(), aby umo liwi dzia anie oczekuj cego w tku. Za chwil
wrócimy jeszcze do tego punktu.
Je li zegar dzia a, metoda wy wietla s owo "tik", nadaje sk adowej state warto "ticked"
i wywo uje metod notify(). Wywo anie metody notify() umo liwia wznowienie dzia ania
w tku, który oczekiwa na dost p do tego samego obiektu. Nast pnie w p tli while wywo y-
wana jest metoda wait(). Wywo anie metody wait() powoduje zawieszenie wykonywania
metody tick() do momentu, w którym inny w tek wywo a metod notify(). Zatem wyko-
nanie p tli zostanie równie wstrzymane do momentu, w którym inny w tek wywo a metod
notify() dla tego samego obiektu. W rezultacie wywo anie metody tick() powoduje wy wie-
tlenie jednego s owa "tik", wznowienie innego w tku i zawieszenie w asnego wykonania.
P tla while, która wywo uje metod wait(), sprawdza, czy sk adowa state ma warto "tocked",
co zdarzy si dopiero po wywo aniu metody tock(). Jak ju wcze niej wyja ni em, zastosowa-
nie p tli while do sprawdzania tego warunku ma zapobiec fa szywemu przebudzeniu w tku.
Gdy metoda wait() zwróci sterowanie, a sk adowa state nie ma warto ci "tocked", oznacza to
w a nie wyst pienie fa szywego przebudzenia i metoda wait() zostaje wywo ana ponownie.
Metoda tock() stanowi dok adn kopi metody tick(), z t ró nic , e wy wietla s owo "tak"
i nadaje sk adowej state warto "tocked". Zatem metoda tock() najpierw wy wietla s owo
"tak", wywo uje metod notify() i nast pnie zawiesza swoje dzia anie. Metody tick() i tack()
mog dzia a tylko razem, przy czym po wywo aniu metody tick() musi nast pi wywo anie
metody tock(), po którym znowu nast puje wywo anie metody tick() i tak dalej. Dzia anie
tych metod jest wzajemnie zsynchronizowane.
Poleć książkę
Kup książkę
Rozdzia 11. Programowanie wielow tkowe 391
Po zatrzymaniu zegara metoda notify() zostaje wywo ana ostatni raz, aby wznowi dzia anie
drugiego w tku. Pami taj, e metody tick() i tock() wywo uj zawsze metod wait() po
wy wietleniu komunikatu. Zatem gdy zegar zostanie zatrzymany, jeden z w tków b dzie si
znajdowa w stanie oczekiwania. Jego dzia anie mo na wznowi w a nie za pomoc ostatniego
wywo ania metody notify(). Spróbuj usun to wywo anie metody notify() i zaobserwo-
wa efekt. Zobaczysz, e program  zawiesi si  i b dziesz musia przerwa jego dzia anie,
naciskaj c Ctrl+C. Dzieje si tak, poniewa gdy ostatnie wywo anie metody tock() spowoduje
wywo anie metody wait(), to nie b dzie odpowiadaj cego mu wywo ania metody notify(),
które pozwoli oby metodzie tock() zako czy dzia anie. Zatem metoda tock() oczekuje
wtedy w niesko czono .
Je li masz jeszcze w tpliwo ci, czy rzeczywi cie wywo ania metod wait() i notify() s
konieczne dla prawid owego dzia ania symulacji zegara, zast p klas TockTock jej poni sz
wersj , z której usun em wywo ania metod wait() i notify().
// Bez wywo a metod wait() i notify().
class TickTock { [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • blogostan.opx.pl