Download as pdf or txt
Download as pdf or txt
You are on page 1of 23

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE

Java.

wiczenia zaawansowane
Autor: Marcin Lis
ISBN: 83-7197-947-9
Format: B5, stron: 142

ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

wiczenia zaawansowane s kolejnym etapem na drodze doskonalenia informatycznych


umiejtnoci. Czytelnicy, ktrzy poznali poprzedni ksik Marcina Lisa Java.
wiczenia praktyczne, z ca pewnoci nie bd zawiedzeni.
Z niniejszej publikacji dowiemy si, jak pisa programy wielowtkowe i jak w Javie
obsugiwa bazy danych. Napiszemy wasny, gotowy do praktycznego uycia czat oraz
aplikacj do wysyania SMS-w. Nauczymy si te tworzy aplikacje sieciowe
z interfejsem graficznym!
Wybrane zagadnienia:
Wtki i programowanie wspbiene w Javie
Synchronizacja wtkw
Programowanie sieciowe
Czym s gniazda?
Serwer wielowtkowy
czenie z baz danych
Dodawanie rekordw
Modyfikacja rekordw w bazie
Obsuga transakcji i wartoci null
Aplikacja z interfejsem graficznym

"
"
"
"
"
"
"
"
"
"

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

Rozdzia 2. Programowanie sieciowe..........................................................................................................29


Czym s gniazda? ....................................................................................................... 29
Gniazda w Javie.......................................................................................................... 30
Klient i serwer............................................................................................................. 35
Transmisja danych ...................................................................................................... 39
Serwer wielowtkowy ................................................................................................ 49

Rozdzia 3. Aplikacje sieciowe z interfejsem graficznym ................................................................ 63


Prawdziwa aplikacja czat (chat) w Javie................................................................. 63
Chat Serwer ................................................................................................................ 77
Wylij SMS................................................................................................................. 88
Idea....................................................................................................................... 92

Rozdzia 4. Bazy danych....................................................................................................................................... 97


czenie z baz danych .............................................................................................. 97
Dodawanie rekordw................................................................................................ 106
Modyfikacja rekordw w bazie ................................................................................ 112
Obsuga transakcji i wartoci null ............................................................................ 120
Aplikacja z interfejsem graficznym.......................................................................... 126

Wtki w Javie reprezentowane s przez klas , znajdujc si w pakiecie 


 .
Program korzystajcy z wicej ni jednego wtku moemy utworzy na dwa sposoby.
Albo wyprowadzimy wasn, now klas z klasy , albo te nasza klasa bdzie
musiaa implementowa interfejs  
. Zajmijmy si na pocztku metod pierwsz.
Utworzymy dwie klasy: klas gwn np.  i klas rozszerzajc klas  np.
. W klasie  naley zdefiniowa metod  , od ktrej rozpocznie si
dziaanie wtku; w klasie  trzeba utworzy obiekt klasy  i wywoa jego
metod . Najlepiej wykona od razu odpowiedni przykad.
wiczenie 1.1.

Napisz kod klasy  dziedziczcej z klasy .




  






  

  




Java. wiczenia zaawansowane

wiczenie 1.2.

Napisz kod klasy  tworzcy wtek .


 


     !"


   # $



 
  




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.


  






  

  %

     !"

$

$




Rozdzia 1. L Wtki i programowanie wspbiene w Javie

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

Gdybymy chcieli samodzielnie nada nazwy poszczeglnym wtkom, moemy nazwy te


przekaza jako parametr w konstruktorze klasy , a nastpnie skorzysta z metody
.
wiczenie 1.4.

Zmodyfikuj kod z wiczenia 1.3 w taki sposb, aby istniaa moliwo nadania wasnych
nazw wtkom.


  


 


%

  

  %

     !"

$
&'( ) *
$
&'( ) +



Sprbujmy jednak przekona si, e rzeczywicie nasze wtki wykonuj si niezalenie


od siebie. Wystarczy, jeli dopiszemy ptl wywietlajc kilkukrotnie nazw kadego
wtku.

10

Java. wiczenia zaawansowane

wiczenie 1.5.

Napisz przykadowy kod ilustrujcy niezalene dziaanie wtkw.




  

  

 ,   


%
  #  

  

-  # .  / 0 11
  %
 
 

 23 



     !"

$
4$5 , +
$
6 , *



Dodatkowo wyposaylimy nasze wtki w metod 


, ktra usypia je na zadan
ilo milisekund. Dziki temu moemy spowodowa, e kady z nich wypisuje dane na
ekran z inn prdkoci. Efekt rnych prdkoci dziaania wida wyranie na rysunku 1.3.
Rysunek 1.3.
Wida wyranie,
e wtki wykonuj
si niezalenie
od siebie

Rozdzia 1. L Wtki i programowanie wspbiene w Javie

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  
):

7  7  $


7
$  7 

Dostpne konstruktory klasy  przedstawione s w tabeli 1.1.


Tabela 1.1. Konstruktory klasy Thread
Konstruktor

Opis



Konstruktor bezparametrowy. Tworzy nowy obiekt klasy 

8  

Tworzy nowy obiekt klasy  zwizany z obiektem docelowym

8  ,


 

Tworzy nowy obiekt klasy  zwizany z obiektem docelowym


 , o nazwie 

 

Tworzy nowy obiekt klasy  o nazwie 

 9 ,


8  

Tworzy nowy obiekt klasy  zwizany z obiektem docelowym


 , przypisany do grupy 

 9 ,


8  ,  

Tworzy nowy obiekt klasy  o nazwie , zwizany z obiektem


docelowym  , przypisany do grupy 

 9 ,


 

Tworzy nowy obiekt klasy  o nazwie , przypisany do grupy

 



wiczenie 1.6.

Napisz przykadowy kod ilustrujcy niezalene dziaanie wtkw. Skorzystaj z interfejsu


 
.


  8

  
 $

 $,   

  #  
 $ # $


12

Java. wiczenia zaawansowane

  



-  # .  / 0 11
 $ 1   1 
 
 

 23 



     !"

8  * # $
 *, :
8  + # $
 +, *
$  *
$  +


Dobrym przykadem wykorzystania interfejsu  


 jest klasa posiadajca interfejs
graficzny. Nie moemy w takim przypadku dziedziczy bezporednio z klasy ,
gdy np. utworzenie okna wymaga dziedziczenia z klasy , a wielodziedziczenia
w Javie nie ma. Stosujemy wic interfejs  
, ktry rozwizuje nasz problem. Postarajmy si zatem napisa prost aplikacj z interfejsem graficznym, ktra bdzie wykonywaa przykadowe obliczenia w osobnym wtku.
wiczenie 1.7.

Napisz aplikacj z interfejsem graficznym, wykonujc w osobnym wtku przykadowe


obliczenia. Stan oblicze powinien by sygnalizowany uytkownikowi.
 ;$<
 ;$<


  =  8, >?, &$?

  $  
  @ 
  @ 
  ? 4 
   

 $  


 $   # $  
-AB$  


&$? 
? 
5:+., +..
 # $ @
@C., *+., D., +.

Rozdzia 1. L Wtki i programowanie wspbiene w Javie


>? 

 # $ @
@+.., *+., D., +.
>? 

4  # $ ?.E
4 @*00, D., F., +.
4 
3
3-
G

  

 # -
-  # .  / *.. 11
 
+0.

 23 

-
(

4  2   1 * 1 E

3
3-

     !"

$


  4->3 
  #  >7
- B
3-

  # $



$ 
3

 - B
 # 


  $$6-&$3 


  $$7&$3 


  $$6&$3 


13

14

Java. wiczenia zaawansowane


  $$7 &$3 

 .

  $$>&$3 


  $$2-&$3 


  $$H&$3 



Rysunek 1.4.
Po klikniciu
przycisku
Start rozpoczy
si obliczenia

W metodzie   napisalimy zwyk ptl  symulujc wykonywanie jakich oblicze.


Co 250 milisekund uaktualnia ona tekst etykiety
 . Wykonywanie tej operacji
rozpoczyna si po naciniciu przycisku Start. Dziaanie ptli moemy przerwa poprzez wcinicie przycisku Stop, nastpuje wtedy przypisanie zmiennej  wartoci
. Warto tej zmiennej sprawdzana jest cyklicznie, zatem po takim przypisaniu nastpi
przerwanie dziaania.
Musimy tutaj zdawa sobie jednak spraw, e mamy dwa obiekty klasy  . Jeden z nich
tworzony jest w metodzie  , drugi po naciniciu przycisku Start. Zatem jeli maj
one ze sob wsppracowa na takiej zasadzie jak przedstawiona powyej, zmienne
, ,
  i  musz by zadeklarowane jako statyczne. Inaczej
kady wtek bdzie operowa na wasnej, lokalnej kopii tych zmiennych i cao oczywicie nie bdzie dziaa. Nic nie stoi jednak na przeszkodzie, aby aplikacj t skonstruowa w taki sposb, aby wtek by tworzony znanym nam ju sposobem, przez oddzieln
klas, pochodn od .
wiczenie 1.8.

Napisz kod klasy  symulujcej wykonywanie oblicze i wsppracujcej z klas


 realizujc interfejs graficzny.


  

  

 
 


 ,   

Rozdzia 1. L Wtki i programowanie wspbiene w Javie




15


  #  
  # 


  

 # -
-  # .  / *.. 11
 
 

 23 

-
(

4  2   1 * 1 E



Metoda   wyglda tu bardzo podobnie, jak w poprzednim wiczeniu. Rnice s takie,


e opnienie jest teraz sparametryzowane, moemy je regulowa wartoci zmiennej

 (jest ona przekazywana w konstruktorze klasy) oraz e wprowadzilimy zmienn
 , ktra jest referencj do obiektu klasy  i umoliwia nam komunikacj z nim.
Dziki temu moemy modyfikowa tekst pojawiajcy si na ekranie. Musimy w tej chwili
tylko przystosowa klas  do wsppracy z naszym nowym wtkiem.
wiczenie 1.9.

Napisz kod klasy  wykorzystujcej przygotowan w wiczeniu 1.8 klas wtku.
 ;$<
 ;$<


  =  >?, &$?

 @ 
 @ 
 ? 4 

  




&$? 
? 
5:+., +..
 # $ @
@C., *+., D., +.
>? 


16

Java. wiczenia zaawansowane


 # $ @
@+.., *+., D., +.
>? 

4  # $ ?.E
4 @*00, D., F., +.
4 
3
3-

G

     !"

$


  4->3 
  #  >7
- B
3-
  # $
 , +0.
 
3

 - B
  # 
3
3-


  $$6-&$3 


  $$7&$3 


  $$6&$3 


  $$7 &$3 

 .

  $$>&$3 


  $$2-&$3 


  $$H&$3 



Rozdzia 1. L Wtki i programowanie wspbiene w Javie

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.

Napisz program, w ktrym dwa wtki bd niezalenie od siebie modyfikoway warto


jednej zmiennej typu  .


  

  $  
   
    # .

 $  ,   


  #  
 $   # $  

  

$ $  
 *  *(
 +  +(
 :  :(


     !"

$
*, *
$
+, +
$
:, .

   *

-  # .  / *. 11
 
 

 23 

11


   +

-  # .  / *. 11
 
 

18

Java. wiczenia zaawansowane



 23 

11



   5   :

 
$*...

 23 
 

  % 1   1 


Wtki  i ! zajmuj si zwikszaniem wartoci zmiennej "" . Jedynym


zadaniem wtku # jest odczekanie 1 000 milisekund i wywietlenie wartoci zmiennej
"" . Uruchomienie powyszego kodu wykae, e faktycznie otrzymamy warto 20,
tak jak przewidzielimy wczeniej. Czy zatem wszystko jest w porzdku? Jak najbardziej.
Co si jednak stanie, jeli instrukcja modyfikujca ""  bdzie w postaci "" $%
"" $&$ ? Napiszmy taki program.
wiczenie 1.11.

Zmodyfikuj kod z wiczenia 1.10 w taki sposb, aby modyfikacja zmiennej ""  bya
w postaci: "" $%$"" $&$ .


  

  $  
   
    # .

 $  ,   


  #  
 $   # $  

  

$ $  
 *  *(
 +  +(
 :  :(


     !"

$
*, *
$
+, +
$
:, .


Rozdzia 1. L Wtki i programowanie wspbiene w Javie

19

   *



-  # .  / *. 11
 
 

 23 

 #  1 *


   +

-  # .  / *. 11
 
 

 23 

 #  1 *


   5   :

 
$*...

 23 
 

  % 1   1 


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

Java. wiczenia zaawansowane


Kod w kadym wtku powinien zatem wyglda nastpujco:
 
-  # .  / *. 11
 # 
 
 

 23 

 #  1 *
  % 1   1 


wiczenie 1.12.

Napisz program wymuszajcy wzajemne przerywanie pracy wtkw przy modyfikacji


wsplnej zmiennej typu  .


  

  $  
   
    # .

 $  ,   


  #  
 $   # $  

  

$ $  
 *  *(
 +  +(
 :  :(


     !"

$
*, *
$
+, +
$
:, .

   *

 
-  # .  / *. 11
 # 
 
 

 23 

 #  1 *
  % 1   1 


Rozdzia 1. L Wtki i programowanie wspbiene w Javie

21


   +

 
-  # .  / *. 11
 # 
 
 

 23 

 #  1 *
  % 1   1 


   5   :

 
$*...

 23 
 

  % 1   1 


Instrukcje    


dokadnie pokazuj nam, co si dzieje. Wynik oczywicie
nie jest prawidowy, gdy pomidzy pobraniem wartoci ""  a jej modyfikacj
i ponownym zapisaniem w kadym wtku wystpuje przerwa, umoliwiajca wykonanie
operacji przez inny wtek. Skutek jest taki, e mwic potocznie nie wie lewica,
co robi prawica i wynik jest zafaszowany.
Rysunek 1.5.
Wida wyranie,
e wtki sobie
wzajemnie
przeszkadzaj

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

Java. wiczenia zaawansowane


   5   $

(;


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.

Dokonaj synchronizacji dostpu do zmiennej ""  z wiczenia 1.12.




  

  $  
   
    # .
  H;  

 $  ,   


  #  
 $   # $  

  

$ $  
 *  *(
 +  +(
 :  :(


     !"

  # $ H;
$
*, *
$
+, +
$
:, .

   *

 
-  # .  / *. 11
  5 
 # 

Rozdzia 1. L Wtki i programowanie wspbiene w Javie

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

Java. wiczenia zaawansowane

Rysunek 1.6.
Synchronizacja
powioda si
i otrzymany
wynik jest
teraz prawidowy

wiczenie 1.14.

Napisz kod klasy )""  enkapsulujcej zmienn typu  .



 >

  


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.


  

  $  
   
  > 

 $  ,   


  #  
 $   # $  

  

$ $  
 *  *(
 +  +(
 :  :(


     !"

 # $ >
$
*, *

Rozdzia 1. L Wtki i programowanie wspbiene w Javie

25

$
+, F
$
:, .


   *

 
-  # .  / *. 11
  5
 # 
 
 

 23 

 #  1 *

  % 1   1 


   +

 
-  # .  / *. 11
  5
 # 
 
 

 23 

 #  1 *

  % 1   1 


   5   :

 
$*...

 23 
 

  % 1   1 


Jak wida, obiektem sucym do synchronizacji jest tu ""  i jednoczenie jest to


obiekt, ktry modyfikujemy w bloku  " '. Jest to bardzo wygodna metoda, gdy
nie musimy tworzy dodatkowych zmiennych zamiecajcych system.
Skorzystajmy teraz z drugiego sposobu synchronizacji, czyli z metod synchronizowanych. Zgodnie z tym, co napisalimy powyej, musimy utworzy metod, ktra bdzie
modyfikowaa obiekt )""  i zadeklarowa j jako  " '. Moe ona wyglda
w sposb nastpujcy:

26

Java. wiczenia zaawansowane


    5  >

  # 
 #  1 *


Pozostaje teraz wykorzysta ten kod w aplikacji.


wiczenie 1.16.

Dokonaj synchronizacji dostpu do zmiennej typu )"" . Wykorzystaj synchronizowan metod )"" .


  

  $  
   
  > 

 $  ,   


  #  
 $   # $  

  

$ $  
 *  *(
 +  +(
 :  :(


     !"

 # $ >
$
*, *
$
+, F
$
:, .

    5  >

  # 
 #  1 *

   *

-  # .  / *. 11
>
  % 1   1 
 
 

 23 




Rozdzia 1. L Wtki i programowanie wspbiene w Javie

   +



-  # .  / *. 11
>
  % 1   1 
 
 

 23 



   5   :

 
$*...

 23 
 

  % 1   1 


27

You might also like