Professional Documents
Culture Documents
Java. Ćwiczenia Zaawansowane
Java. Ćwiczenia Zaawansowane
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
Java.
wiczenia zaawansowane
Autor: Marcin Lis
ISBN: 83-7197-947-9
Format: B5, stron: 142
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
"
"
"
"
"
"
"
"
"
"
Ksika otwiera now seri wydawnicz, ktrej gwnym zadaniem bdzie poszerzenie
uzyskanych wiadomoci.
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Wstp...................................................................................................................................................... 5
Rozdzia 1. Wtki i programowanie wspbiene w Javie .................................................................... 7
Klasa Thread................................................................................................................. 7
Interfejs Runnable....................................................................................................... 11
Synchronizacja wtkw .............................................................................................. 17
wiczenie 1.2.
Jeli spojrzymy teraz na rysunek 1.1, przekonamy si, e oba wtki faktycznie zostay
wykonane. Podobny efekt moemy osign rwnie w nieco inny sposb. Nie trzeba
tworzy oddzielnie klasy uruchomieniowej dla wtku (w naszym przypadku bya to klasa
). Wystarczy w klasie wyprowadzonej z zdefiniowa metod i tam
utworzy obiekty wtkw.
Rysunek 1.1.
Wyranie wida,
e oba wtki
zostay wykonane
wiczenie 1.3.
Napisz kod klasy wyprowadzonej z klasy , uruchamiajcej dwa przykadowe wtki.
%
!"
$
$
Efekt dziaania kodu z wiczenia 1.3 widoczny jest na rysunku 1.2. Na ekranie wywietlone s nazwy wtkw nadane im przez system. Wykorzystalimy w tym celu metod
klasy . Warto zauway, e w tej chwili mamy inn sytuacj ni w poprzednich przykadach. W wiczeniach 1.1 i 1.2 wystpoway dwa wtki, wtek gwny
i wtek klasy . Teraz mamy trzy wtki wtek gwny, ktrego wykonanie
rozpoczyna si od metody , oraz dwa wtki tworzone przez nas w tej metodzie,
ktrych wykonywanie rozpoczyna si od metody .
Rysunek 1.2.
Na ekranie
wywietlone
zostay systemowe
nazwy wtkw
Zmodyfikuj kod z wiczenia 1.3 w taki sposb, aby istniaa moliwo nadania wasnych
nazw wtkom.
%
%
!"
$
&'( ) *
$
&'( ) +
10
wiczenie 1.5.
11
Wyprowadzanie wasnej klasy z klasy jest wygodne, ale nie zawsze moliwe.
Z sytuacj tak bdziemy mieli do czynienia, gdy nasza klasa ju dziedziczy z innej,
a musimy uzupeni j o moliwo dziaania wielowtkowego. Na szczcie istnieje
interfejs
, ktry pomoe nam w rozwizaniu tego problemu.
W interfejsie
zdefiniowana jest jedna metoda: , od ktrej, podobnie jak
w przypadku klasy , rozpoczyna si wykonywanie kodu wtku. W celu uruchomienia nowego wtku tworzymy nowy obiekt naszej klasy, a nastpnie uywamy go jako
parametru konstruktora klasy . Schematycznie wyglda to nastpujco (zakadajc,
e
implementuje
):
Opis
wiczenie 1.6.
12
13
14
$$7 &$3
.
$$>&$3
$$2-&$3
$$H&$3
Rysunek 1.4.
Po klikniciu
przycisku
Start rozpoczy
si obliczenia
,
15
#
#
# -
- # . / *.. 11
23
-
(
4 2 1 * 1 E
Napisz kod klasy wykorzystujcej przygotowan w wiczeniu 1.8 klas wtku.
;$<
;$<
= >?, &$?
@
@
? 4
&$?
?
5:+., +..
# $ @
@C., *+., D., +.
>?
16
G
!"
$
4->3
# >7
- B
3-
# $
, +0.
3
- B
#
3
3-
$$6-&$3
$$7&$3
$$6&$3
$$7 &$3
.
$$>&$3
$$2-&$3
$$H&$3
17
Rozwamy w tej chwili nastpujc sytuacj: mamy zmienn typu cakowitego i dwa wtki
modyfikujce jej warto. Zamy, e bdzie to dodawanie w ptli w kadym przebiegu
wartoci 1, a sama ptla bdzie miaa tych przebiegw 10. Jaka bdzie ostateczna warto
naszej zmiennej? Jeli pierwszy wtek 10 razy zwikszy warto o 1 i drugi wtek zrobi
to samo, to w sumie powinno da 20. Napiszmy taki program.
wiczenie 1.10.
18
5
:
$*...
23
% 1 1
Zmodyfikuj kod z wiczenia 1.10 w taki sposb, aby modyfikacja zmiennej "" bya
w postaci: ""$%$""$&$ .
$
# .
$
,
#
$
# $
$
$
*
*(
+
+(
:
:(
!"
$
*, *
$
+, +
$
:, .
19
Modyfikacje nie byy due, a po uruchomieniu ujrzymy prawdopodobnie rwnie wynik 20.
Czy zatem wszystko znowu jest w porzdku? Ot absolutnie nie! Wszystko zaley teraz
od kompilatora. Jeli jest on inteligentny, prawdopodobnie potraktuje instrukcj ""
%$ ""$ &$ jako ""&&. W takim wypadku faktycznie program bdzie prawidowy, gdy ""&& jest instrukcj atomow, tzn. nie moe by ona przerwana przez
inny wtek. Niestety nie naley przyjmowa takiego zaoenia, natomiast trzeba traktowa
taki kod jako zoenie nastpujcych operacji:
L pobranie wartoci "",
L dodanie do tej wartoci 1,
L zapisanie otrzymanej wartoci do zmiennej "".
Skoro tak, operacje te mog zosta przerwane przez inny wtek. Co si wtedy stanie? Ot
otrzymany wynik na pewno nie bdzie prawidowy. eby si o tym przekona, zasymulujemy przerywanie tych operacji. Zrobimy to w sposb nastpujcy:
L warto zmiennej "" bdziemy modyfikowa w dwch krokach,
L pomidzy poszczeglnymi operacjami dodamy instrukcj
, usypiajc dany
wtek.
20
wiczenie 1.12.
21
+
- # . / *. 11
#
23
# 1 *
% 1 1
5
:
$*...
23
% 1 1
Jest to typowy przykad dostpu do zasobu wspdzielonego przez pracujce wspbienie wtki. Aby zatem nasz przykad by poprawny, musimy dokona ich synchronizacji. W Javie suy do tego instrukcja "'. Moemy j stosowa zarwno
w przypadku metod (ang. synchronized methods), jak i obiektw. Jeeli zadeklarujemy
metod jako "', np.:
22
to wywoanie takiej metody powoduje zablokowanie obiektu, na rzecz ktrego jest ona
wywoywana. Obiekt ten bdzie zablokowany, a do zakoczenia wykonywania teje
instrukcji i inne wtki nie bd miay do niego dostpu. Druga metoda to zablokowanie
obiektu w postaci:
5(
(;
przy czym obiekt uyty do synchronizacji nie musi by uyty w bloku instrukcji. Sprbujmy zatem zsynchronizowa dostp do zmiennej "" z poprzedniego wiczenia.
wiczenie 1.13.
23
23
# 1 *
% 1 1
+
- # . / *. 11
5
#
23
# 1 *
% 1 1
5
:
$*...
23
% 1 1
Na rysunku 1.6 wida, e synchronizacja zakoczya si penym powodzeniem. Uylimy dodatkowego obiektu , ktry peni rol stranika dostpu do zmiennej
"". Jest to jego jedyna rola, do niczego innego nam w tym przykadzie nie suy.
Oczywicie nic nie stoi na przeszkodzie, aby uy obiektu, ktry jest wykorzystywany
w kodzie programu, np. tablicy, jednake w powyszym wiczeniu po prostu nie mielimy takiego pod rk. Nie moemy natomiast uy w tym celu zmiennej "" (wszak
to byoby najwygodniejsze), gdy jest ona typu , a instrukcji "' moemy
uy tylko w stosunku do typw wyprowadzonych z klasy (". Pokamy jednak,
e do synchronizacji mona uy obiektu, ktry bdzie modyfikowany. Nie musimy wtedy wprowadza dodatkowej zmiennej synchronizacyjnej. Aby tego dokona, musimy
napisa wasn klas enkapsulujc zmienn typu . To zadanie powinno by zupenie
banalne.
24
Rysunek 1.6.
Synchronizacja
powioda si
i otrzymany
wynik jest
teraz prawidowy
wiczenie 1.14.
wiczenie 1.15.
Dokonaj synchronizacji dostpu do zmiennej "" z wiczenia 1.12. Nie uywaj dodatkowego obiektu klasy (". Zamiast tego zmie typ "" z na )"" i uyj tego
obiektu do synchronizacji.
$
>
$
,
#
$
# $
$
$
*
*(
+
+(
:
:(
!"
# $ >
$
*, *
25
$
+, F
$
:, .
*
- # . / *. 11
5
#
23
# 1 *
% 1 1
+
- # . / *. 11
5
#
23
# 1 *
% 1 1
5
:
$*...
23
% 1 1
26
Dokonaj synchronizacji dostpu do zmiennej typu )"". Wykorzystaj synchronizowan metod )"".
$
>
$
,
#
$
# $
$
$
*
*(
+
+(
:
:(
!"
# $ >
$
*, *
$
+, F
$
:, .
5 >
#
# 1 *
*
- # . / *. 11
>
% 1 1
23
27