Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Java 2. Techniki
zaawansowane.
Wydanie II
Autorzy: Cay Horstmann, Gary Cornell
Tumaczenie: Jaromir Senczyk
ISBN: 83-7361-842-2
Tytu oryginau: Core Java(TM) 2, Volume II
Advanced Features (7th Edition)
Format: B5, stron: 1144
Przykady na ftp: 1644 kB
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Aplikacje wielowtkowe
Kolekcje i operacje na nich
Poczenia sieciowe
Interfejs JDBC i LDAP
Aplikacje rozproszone
Technologia CORBA
Zaawansowane moliwoci bibliotek Swing i AWT
Technologia JavaBeans
Bezpieczestwo aplikacji
Internacjonalizacja
Korzystanie z jzyka XML
Jeli zamierzasz wykorzysta Jav w zoonym projekcie informatycznym, ta ksika bdzie
dla Ciebie niezastpiona.
Spis treci
Podzikowania........................................................................................................................................... 11
Przedmowa............................................................................................................................................... 13
Do Czytelnika.............................................................................................................. 13
O ksice ................................................................................................................... 13
Rozdzia 2. Kolekcje..................................................................................................................................111
Interfejsy kolekcji ...................................................................................................... 111
Rozdzielenie interfejsw kolekcji od ich implementacji.............................................. 112
Interfejsy Collection i Iterator w bibliotekach jzyka Java........................................... 114
Kolekcje konkretne.................................................................................................... 119
Listy powizane ................................................................................................... 120
Klasa ArrayList .................................................................................................... 128
Zbiory z kodowaniem mieszajcym ......................................................................... 129
Zbiory drzewiaste ................................................................................................. 132
Kolejki z priorytetami ............................................................................................ 138
Mapy .................................................................................................................. 139
Specjalizowane klasy zbiorw i map ....................................................................... 144
Szkielet kolekcji ........................................................................................................ 149
Widoki i opakowania............................................................................................. 152
Operacje masowe ................................................................................................ 158
Wykorzystanie biblioteki kolekcji z tradycyjnymi bibliotekami ..................................... 159
Rozbudowywanie szkieletu .................................................................................... 160
Algorytmy ................................................................................................................. 163
Sortowanie i tasowanie......................................................................................... 164
Wyszukiwanie binarne........................................................................................... 167
Proste algorytmy .................................................................................................. 168
Programowanie wasnych algorytmw ..................................................................... 169
Tradycyjne kolekcje.................................................................................................... 171
Klasa Hashtable .................................................................................................. 171
Wyliczenia ........................................................................................................... 171
Zbiory waciwoci ............................................................................................... 172
Stosy.................................................................................................................. 173
Zbiory bitw......................................................................................................... 173
Spis treci
Spis treci
Spis treci
Skorowidz.............................................................................................................................................1093
Wielowtkowo
W tym rozdziale:
n
Czym s wtki?
Przerywanie wtkw.
Stany wtkw.
Waciwoci wtkw.
Synchronizacja.
Kolejki blokujce.
Kolekcje.
Egzekutory.
Synchronizatory.
Wtki i Swing.
18
Czym s wtki?
Zapoznajmy si najpierw z przykadowym programem, ktry nie uywa wtkw i w konsekwencji uytkownik nie moe wykona za jego pomoc wielu dziaa naraz. Pniej pokaemy, jak atwo usun te niedogodnoci, wprowadzajc do programu wtki. Program
ten bdzie animacj piki odbijajcej si od ramki okienka (patrz rysunek 1.1).
Wybranie przez uytkownika przycisku Start powoduje pojawienie si w lewym grnym
rogu okienka piki, ktra rozpoczyna swj ruch. Metoda obsugi zdarzenia dla przycisku
Start wywouje metod . Metoda ta zawiera ptl, w ktrej 1000 razy wykonywana
jest metoda powodujca niewielkie przesunicie rysunku piki, ewentualn zmian
kierunku ruchu w przypadku odbicia od ramki i odrysowanie ta okna.
Rozdzia 1. n Wielowtkowo
19
Rysunek 1.1.
Animacja piki
odbijajcej si
od ramki okienka
!
"
#$!
#!
%&'(
)
wewntrz metody klasy . Rozwizanie to moe wydawa si dziwne, poniewa zwykle wywoujemy metod
i pozwalamy AWT zaj si okreleniem kontekstu graficznego i odrysowaniem zawartoci okna. Jednak jeli postpimy w ten
sposb take w tym programie, to odrysowanie nie bdzie mogo si odby, poniewa
metoda zmonopolizowaa przetwarzanie. W nastpnej wersji programu, ktra
bdzie oblicza kolejne pozycji piki w osobnym wtku, z powrotem bdziemy mogli zastosowa wywoanie metody
.
20
Rozdzia 1. n Wielowtkowo
> !D(
> !D(
>E>
)
>(9FG !D,(
> !D,(
E(9F
>E>
)
)
-++
=>1!=0
01H.$*
=>$*
+
$
!C%#
!C%%
,?>?89F?(9F
)
!$89FI
!$(9FI
,J
>J
,
>
)
-++
>! *.$>
01
+$!!,!4
-++
%*
01/
K
01
+
$
!
)
$
6
"
#$!
!
6
"
#$!C%C
"
#$!C%
L!
C
#
)
)
'>&!G! '>&!G
)
-++
B1= *.$0
=>$!1
21
22
Rozdzia 1. n Wielowtkowo
23
!
"
#$!
#!
%&'(
)
)
$$#
9
,$
)
)
$!$%5'O&:P9%QSIJ
$!$%5'O&:Q9"QTIJ
$!$JJJ
$!$%&'(T
)
n
milisekund.
Parametry:
Zastosowanie wtkw
Program animacji piki moe lepiej odpowiada na akcje uytkownika, jeli kod odpowiedzialny za animacj umiecimy w osobnym wtku. Rozwizanie takie pozwoli nam nawet
animowa wiele piek. Animacja kadej z nich odbywa bdzie si w osobnym wtku.
Rwnolegle z wtkami animacji dziaa bdzie rwnie wtek obsugi zdarze AWT zajmujcy si obsug zdarze zwizanych z interfejsem uytkownika. Poniewa wszystkie
wtki maj rwn szans wykonania, to gwny wtek programu moe teraz uzyska infomacj o wybraniu przez uytkownika przycisku Close i odpowiednio zareagowa na to zdarzenie. A oto prosty sposb na uruchomienie zadania w osobnym wtku:
1. Kod realizujcy zadanie umieszczamy wewntrz metody
klasy implementujcej
interfejs . Interfejs ten jest bardzo prosty i posiada tylko jedn metod:
$$B
)
24
4. Uruchamiamy wtek:
!
Aby kod animacji piki wykonywany by we wasnym wtku, wystarczy umieci go wewntrz metody
klasy :
$!!B
!B
$
>
$
!
$
#!
%&'(
)
)
$$#
9
,$
)
)
)
Rozdzia 1. n Wielowtkowo
25
Rysunek 1.2.
Animacja
wielowtkowa
I to wszystko! W ten sposb dowiedziae si, w jaki sposb uruchamia rwnolegle dziaajce wtki. Pozostaa cz tego rozdziau powicona jest interakcjom pomidzy wtkami.
Wtek moemy rwnie zdefiniowa, tworzc klas pochodn klasy
:
$!!D>#,!#
$
)
)
Nastpnie tworzymy obiekt tej klasy pochodnej i wywoujemy jego metod
. Rozwizanie takie nie jest jednak zalecane. Naley dy do oddzielenia wykonywanego
zadania od mechanizmu jego wykonywania. W sytuacji, gdy musimy wykona du liczb zada, tworzenie wtku dla kadego z nich jest zbyt kosztowne i lepiej jest wykorzysta pul wtkw (patrz strona 83.).
Nie naley wywoywa bezporednio metody zostanie ona wywoana przez metod , w momencie gdy wtek jest gotowy do rozpoczcia dziaania. Bezporednie wywoanie metody spowoduje jej wykonanie w biecym wtku zamiast utworzenia nowego.
26
Rozdzia 1. n Wielowtkowo
-++
=!
01/!/
*
=>$*?=*.$1 1 $# ?
*@1 /A
+
$
B$C% !
,,
>>
, !D8
, !D8
,E,
)
,89FG !D,8
, !D,8
E89F
,E,
)
> !D(
> !D(
>E>
)
>(9FG !D,(
> !D,(
E(9F
>E>
)
)
-++
=>1!=0
01H.$*
=>$*
+
$
!C%#
!C%%
,?>?89F?(9F
)
!$89FI
!$(9FI
,J
>J
,
>
)
-++
>! *.$>
01/
+$!!,!4
-++
%*
01/
K
01
+
$
!
27
28
Rozdzia 1. n Wielowtkowo
29
n
tworzy
n
n
Przerywanie wtkw
Wykonanie wtku koczy si w momencie, gdy metoda
zwraca sterowanie. (W pierwszej wersji jzyka Java istniaa take metoda
, za pomoc ktrej jeden wtek mg zakoczy wykonywanie innego. Obecnie metoda ta nie jest stosowana, a przyczyny tego
omwimy w dalszej czci rozdziau).
30
Jednak wtek, ktrego wykonywanie zostao zablokowane, nie moe sprawdzi wasnego
statusu przerwania. I wanie w takim przypadku pomocny jest wyjtek
. Jeli metoda
zostanie wywoana dla wtku, ktrego wykonanie jest zablokowane, to blokujca go metoda
lub zostanie przerwana i pojawi si wyjtek
.
rodowisko jzyka Java nie wymaga wcale, aby wtek przerwany w taki sposb zakoczy
swoje wykonywanie. Przerwanie wtku sygnalizuje jedynie pojawienie si pewnego dania. Przerwany wtek sam decyduje, w jaki sposb zareagowa na takie danie. Wykonanie niektrych wtkw w programie moe by na tyle wane, e po prostu zignoruj one
wyjtek i kontynuowa bd swoje dziaanie. Najczciej jednak wtek zinterpretuje wyjtek jako danie zakoczenia wykonywania. Metoda
takiego wtku wyglda wtedy nastpujco:
$
>
#
V#$ #
!9
UU!.=0 >1
)
)
$$#
9
,$
,$
-- .1
= > 1$>!
)
>
)
--=1W$= >1> > >!> .1
)
Rozdzia 1. n Wielowtkowo
31
. Dlatego te, gdy metoda
wywoywana jest w ptli, to nie musimy
sprawdza statusu przerwania wtku. Wystarczy jedynie zaj si obsug wyjtku
. Metoda
posiada wtedy nastpujc posta:
$
>
#
!.=0 >1
>1*=0
#!
>
)
)
$$#
9
,$
,$
-- .1
= > 1$>!
)
>
)
--=1W$= >1> > >!> .1
)
Czsto mona spotka fragmenty kodu, w ktrych obsuga wystpienia wyjtku
jest pominita, co wida poniej:
>!
>)
$$#
9
,$
,$
)--X&V
Nie wolno pisa programw w ten sposb! Jeli nie wiemy, jak obsuy wyjtek w klauzuli , to zawsze mamy jeszcze dwie inne moliwoci:
n
32
n
n
sprawdza,
n
sprawdza,
Stany wtkw
Wtki mog znajdowa si w jednym z czterech stanw:
n
nowym,
wykonywalnym,
zablokowanym,
martwym.
Nowe wtki
Kiedy tworzymy wtek za pomoc operatora na przykad nie jest on
jeszcze wykonywany. Znajduje si wtedy w stanie nowy i kod w nim zawarty nie jest wykonywany. Zanim zostanie uruchomiony, system musi wykona jeszcze pewne operacje.
Rozdzia 1. n Wielowtkowo
33
Wtki wykonywalne
Po wywoaniu metody
wtek jest wykonywalny. Wykonywalny wtek nie musi by
od razu wykonywany. Przydzia procesora zaley bowiem od systemu operacyjnego. Kiedy
zostanie przydzielony, mwimy, e wtek jest wykonywany. (Dokumentacja jzyka Java nie
przewiduje w tym przypadku oddzielnego stanu wtku, wtek wykonywany znajduje si
nadal w stanie wykonywalnym).
Wtek nie powinien by wykonywany w sposb cigy. Podane jest, aby kady z wtkw
cyklicznie zawiesza swoje wykonanie, dajc tym samym szans innym wtkom. Szczegy
szeregowania wtkw zale take od systemu operacyjnego. Systemy stosujce szeregowanie z wydziedziczaniem udostpniaj kademu wtkowi wykonywalnemu przedzia czasu,
w ktrym moe on wykonywa swoje zadania. Gdy przedzia ten zakoczy si, system operacyjny wywaszcza wtek, dajc okazj wykonania kolejnemu wtkowi (patrz rysunek 1.4). Wybierajc ten wtek, system operacyjny bierze pod uwag priorytety wtkw (patrz strona 36.).
Wszystkie wspczesne systemy operacyjne stacji roboczych i serwerw stosuj szeregowanie z wywaszczaniem, natomiast proste urzdzenia, takie jak na przykad telefony komrkowe, mog uywa szeregowania kooperacyjnego. W takim przypadku wtek przestaje by wykonywany dopiero wtedy, gdy sam wywoa odpowiedni metod w rodzaju
czy .
W systemach posiadajcych wiele procesorw kady procesor moe wykonywa inny wtek. Mamy wtedy sytuacj, w ktrej wtki rzeczywicie wykonywane s rwnolegle. Jeli
jednak wtkw jest wicej ni procesorw, to szeregowanie wtkw znowu musi odbywa
si z podziaem czasu.
Naley pamita, e wtek bdcy w stanie wykonywalnym w danym momencie moe by
wykonywany lub nie (dlatego stan ten okrelamy jako wykonywalny, a nie wykonywany).
Wtki zablokowane
Wtek znajduje si w stanie zablokowanym, w przypadku gdy zasza jedna z poniszych
sytuacji:
n
34
Rysunek 1.3.
Diagram
stanw wtku
zakoczy.
3. Jeli wtek zamierza uzyska blokad obiektu posiadan przez inny wtek,
to wtek ten musi zrzec si blokady obiektu. (Moliwe jest rwnie oczekiwanie
na zwolnienie blokady z okrelonym limitem czasu. Wtedy wtek zostaje
odblokowany po jego upywie).
4. Jeli wtek oczekuje na spenienie pewnego warunku, to jego zajcie musi
Rozdzia 1. n Wielowtkowo
35
Wtki martwe
Wtek moe by martwy gdy zaistnieje jeden z dwch powodw.
n
n " zwraca
n $oczekuje
n $ oczekuje
36
Waciwoci wtkw
W kolejnych punktach omwione zostan inne waciwoci wtkw: priorytety, wtkidemony, grupy wtkw i domylne procedury obsugi wyjtkw.
Priorytety wtkw
W jzyku Java z kadym wtkiem zwizany jest okrelony priorytet. Domylnie wtek dziedziczy priorytet po swoim wtku nadrzdnym, czyli wtku, ktry go utworzy. Mona go jednak zmniejszy lub zwikszy, stosujc metod %
. Za jej pomoc mona priorytetowi nada dowoln warto z przedziau od &'(%)* (zdefiniowane jako 1 w klasie
) do &"+(%)* (zdefiniowane jako 10). Priorytet ')&(%)* posiada warto 5.
Gdy program szeregowania wtkw musi wybra nowy wtek, zawsze wybiera wtek wykonywalny o najwyszym priorytecie. Naley zaznaczy, e wszelkie zasady dziaania zwizane z priorytetami wtkw s w znacznym stopniu zalene od konkretnego systemu operacyjnego. Jeli maszyna wirtualna jzyka Java wykorzystuje zarzdzanie wtkami danej
platformy, to musi dokona odwzorowania priorytetw wtkw zdefiniowanych w jzyku
Java na poziomy priorytetw tej platformy (ktrych moe by mniej lub wicej ni wartoci
priorytetw w jzyku Java).
Na przykad w systemie Windows NT/XP istnieje siedem poziomw priorytetw, mniej ni
definiuje to Java. Niezalenie wic od sposobu odwzorowanie priorytetw zdarza si bdzie,
e wtki, ktre maj rny priorytet w jzyku Java, bd posiada w rzeczywistoci ten sam
priorytet z punktu widzenia systemu operacyjnego. W przypadku maszyny wirtualnej Java
firmy Sun dla systemu Linux informacja o priorytetach wtkw jest w ogle ignorowana.
Z tego powodu naley traktowa priorytety wtkw jedynie jako rodzaj wskazwki dla
programu szeregujcego. W adnym wypadku nie naley tworzy programw, ktrych poprawne dziaanie zaley od poziomw priorytetw.
Jeli zamierzasz uywa priorytetw wtkw, to powiniene wiedzie o bdzie popenianym czsto przez pocztkujcych. Jeli w programie istnieje kilka wtkw o wysokim priorytecie, ktre rzadko znajduj si w stanie zablokowanym, to mog one uniemoliwi wykonywanie wtkw o niskim priorytecie. Program szeregujcy wtki zawsze
wybiera najpierw spord wtkw o wyszym priorytecie, nawet jeli w ten sposb
wtki o niszym priorytecie nie s nigdy wykonywane.
n %
%
okrela
n &'(%)* minimalna
n ')&(%)*
Rozdzia 1. n Wielowtkowo
n &"+(%)* maksymalna
37
Wtki-demony
Wtek staje si wtkiem-demonem przez wywoanie
!%
Wtek-demon nie ma w sobie nic demonicznego. Jest to po prostu wtek, ktrego jedynym
zadaniem jest suenie innym wtkom. Przykadem wtkw-demonw mog by wtki zegara, ktre dostarczaj innym wtkom informacji o upywie czasu. Jeli dla danego programu pozostaje jedynie wtek-demon, to program koczy swoje dziaania.
n ! !
Grupy wtkw
Niektre programy wykonuj wiele wtkw. Przydatna wtedy okazuje si moliwo kategoryzacji na podstawie ich funkcji. Jako przykad wemy przegldark internetow. Jeli
wiele wtkw zajmuje si adowaniem rnych obrazkw zamieszczonych na danej stronie,
a uytkownik wybierze przycisk Stop, to wykonywanie wszystkich tych wtkw powinno
zosta przerwane. Java pozwala tworzy w tym celu grupy wtkw.
Grup wtkw tworzymy, wywoujc konstruktor klasy
,
:
;
#"
#"
;
acuch znakw bdcy parametrem konstruktora identyfikuje grup wtkw i musi by unikalny. Wtki dodajemy do danej grupy, okrelajc j za pomoc parametru konstruktora wtku.
# #
?#;
Aby dowiedzie si, czy istnieje jaki wykonywalny wtek danej grupy, uywamy metody
.
$6
J
-- !=>!1 .1*
>=1W$=>0>=0
)
38
Ten sam efekt moemy osign bez uywania grup wtkw, lecz za pomoc egzekutorw
(patrz strona 88.).
Grupy wtkw mog posiada podgrupy. Domylnie nowo tworzona grupa wtkw staje
si podgrup biecej grupy. Grup nadrzdn mona take okreli za pomoc parametru
konstruktora grupy (patrz opis konstruktora). Metody oraz
odnosz
si do wszystkich wtkw w grupie oraz jej podgrup.
n
,
-.
wtkw.
Parametry:
n
,
,
zwraca
n
,
.
n
,
,
-.
Parametry:
n zwraca
do wszystkich wtkw
aktywnych w danej grupie; aby okreli rozmiar tablicy referencji, warto uy
metody ; moe zdarzy si, e tablica okae si za maa (na przykad
gdy po uyciu metody utworzono duo nowych wtkw), wtedy
znajd si w niej referencje do czci wtkw.
Parametry:
n
,
%
pobiera
n
przerywa
Rozdzia 1. n Wielowtkowo
39
Wspomniany zrzut stosu znany jest dobrze wszystkim piszcym programy w jzyku Java.
W wersjach wczeniejszych ni JDK 5.0 nie istniaa bezporednia moliwo zainstalowania wasnej procedury obsugi wyjtkw dla wszystkich wtkw ani dla poszczeglnych wtkw. W tym celu naleao stworzy klas pochodn klasy
,
40
n !#1
2
1
!#1
2
5.0 konfiguruje lub pobiera domyln
lub pobiera procedur obsugi wyjtkw. Jeli adna taka procedura nie zostanie
skonfigurowana, to uywana jest w tym celu grupa, do ktrej naley wtek.
n
-
. Metod
t definiujemy, aby
uzyska raport, gdy dziaanie wtku zostao zakoczone na skutek nieobuonego
wyjtku.
Parametry:
n
-
. Metod
t zastpujemy wasn
wersj, aby reagowa na wyjtki powodujce zakoczenie wtkw tej grupy.
Domylna implementacja wywouje t sam metod grupy nadrzdnej, a jeli grupa
nadrzdna nie istnieje, to wysya zrzut stosu do standardowego strumienia bdw.
(Jeli jest obiektem klasy
!, to informacja o zawartoci stosu nie jest
wysyana. Obiekty klasy
! generowane s przez metod
, ktrej nie
naley stosowa).