j¦zyk programowania jaav c 2011-12 radosªaw klimekhome.agh.edu.pl/~rklimek/paw/java4.pdfsystemy...

41

Upload: ngocong

Post on 15-Jul-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

J¦zyk programowania JAVA

c© 2011-12 Radosªaw Klimek

Vincent Van GOGH: M¦»czyzna pij¡cy �li»ank¦ kawy

Radosªaw Klimek J¦zyk programowania Java

Page 2: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

W¡tki

Proces to wykonuj¡cy si¦ program wraz z dynamicznieprzydzielanymi mu przez system zasobami (np. pami¦ci¡operacyjn¡, zasobami plikowymi). Ka»dy proces ma wªasn¡przestrze« adresow¡.W¡tek to sekwencja dziaªa«, która wykonuje si¦ w kontek±ciedanego procesu (programu)Ka»dy proces ma co najmniej jeden wykonuj¡cy si¦ w¡tek. Wsystemach wielow¡tkowych proces mo»e wykonywa¢ równolegle(teoretycznie) wiele w¡tków, które wykonuj¡ si¦ w jednej przestrzeniadresowej procesu.

Radosªaw Klimek J¦zyk programowania Java

Page 3: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Programowanie wielow¡tkowe

Cech¡ charakterystyczn¡ programowania wielow¡tkowego jestto, »e tworzone programy dzieli si¦ na wieksz¡ liczb¦ procesów,które mog¡ by¢ wykonywane równocze±nie. Wiele zada«wyst¦puj¡cych w interakcyjnych programach jest wykonywanychwspóªbie»nie. Zadania, które mog¡ by¢ wykonywane wspóªbie»nieto np:

odczytywanie i zapisywanie plików

korzystanie z zasobów sieciowych

reagowanie na dane wprowadzane przez u»ytkownika

wykonywanie skomplikowanych trwaj¡cych dªugo oblicze«

wy±wietlanie animacji i interfejsów u»ytkonika

Radosªaw Klimek J¦zyk programowania Java

Page 4: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Wkorzystanie w¡tków

Reasumuj¡c, w¡tki mo»na wykorzysta¢ w wielu sytuacjach:

Wszelkie obliczenia, które mog¡ zablokowa¢ interfejsu»ytkownika powinny by¢ wykonywane asynchronicznie

Animacje, które powinny by¢ przetwarzane niezale»nie odinterfejsu u»ytkownika

Pobieranie danych z internetu (zamiast przetwarza¢ stronyinternetowe jedna po drugiej mo»na poª¡czy¢ si¦ np. z 10jednocze±nie)

W ogólno±ci wszystkie operacje wej±cia/wyj±cia, zapis i odczytplików, czy baz danych

Zªo»one obliczenia, które mog¡ by¢ podzielone na mniejszepodzadania

I wiele innych

Radosªaw Klimek J¦zyk programowania Java

Page 5: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Jednow¡tkowa p¦tla zdarze«

W systemach jednow¡tkowych stosowane jest rozwi¡zanie zwanep¦tl¡ zdarze« z odpytywaniem. W takim modelu istnieje jednap¦tla niesko«czona, w której wykonywane s¡ kolejne w¡tkipobierane z kolejki procesów. Poszczególne w¡tki wykonywane s¡przez odpowiadaj¡ce im procedury obsªugi zdarze«. Do zako«czeniabie»¡cego w¡tku, nie mo»e by¢ w systemie podj¦te »adne innedziaªanie.

Radosªaw Klimek J¦zyk programowania Java

Page 6: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Systemy wielow¡tkowe

Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizmprzydzielania czasu procesora poszczególnym wykonuj¡cym si¦w¡tkom. Ka»dy w¡tek uzyskuje dost¦p do procesora na kwantczasu, po czym przekazuje procesor innemu w¡tkowi. Zmiana w¡tkuwykonywanego przez procesor mo»e dokonywa¢ si¦ na zasadzie:

wspóªpracy � w¡tek sam decyduje, kiedy odda¢ czasprocesora innym w¡tkom,

wywªaszczania � o dost¦pie w¡tków do procesora decydujesystemowy zarz¡dca w¡tków, który przydziela w¡tkowi kwantczasu procesora, po upªywie którego odsuwa w¡tek odprocesora i przydziela kolejny kwant czasu innemu w¡tkowi.

Java jest j¦zykiem wieloplatformowym, a ró»ne systemy operacyjnestosuj¡ ró»ne mechanizmy udost¦pniania w¡tkom procesora.Programy wielow¡tkowe powinny by¢ tak pisane, by dziaªaªyzarówno w ±rodowisku �wspóªpracy� jak i �wywªaszczania�.

Radosªaw Klimek J¦zyk programowania Java

Page 7: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Systemy wielow¡tkowe

W sytemie wielow¡tkowym wykorzystuje si¦ fakt, »e wi¦kszo±¢czasu wykonywania w¡tku to czas oczekiwania na dost¦pn¡±¢zasobu. Je»eli wszystkie procesy s¡ niezale»nymi w¡tkami, a systempotra� przeªacza¢ si¦ pomi¦dzy w¡tkiem oczekuj¡cym na danyzasób, a w¡tkiem gotowym do dziaªania, to w tym samym czasiemo»na wykona¢ znacznie wi¦cej dziaªa«.

W Javie nie ma pojedy«czej p¦tli zdarze«. Je»eli jeden w¡tek np.:

odczytuje dane z sieci

czeka na dane wprowadzane przez u»ytkownika

albo wy±wietla animacje, nie wykonuj¡c »adnych innych dziaªa«

to pozostaªe w¡tki mog¡ dziaªa¢ bez jakichkolwiek przerw

Radosªaw Klimek J¦zyk programowania Java

Page 8: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Systemy wielow¡tkowe

Bardzo wa»ne jest równie» to, »e je±li uruchomimy jeden po drugimnp. 10 w¡tków, to wcale nie b¦d¡ one wykonywaªy si¦ sekwencyjniejeden po drugim, je±li sami o to nie zadbamy. Je±li jakie± zadanienie zd¡»y si¦ wykona¢ w czasie, który zostaª dla niego przydzielony,to mo»e ono zosta¢ przerwane na pewien czas.

Radosªaw Klimek J¦zyk programowania Java

Page 9: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Tworzenie w¡tków

W¡tki w Javie mo»na tworzy¢ na kilka sposobów, poprzez:

jawne rozszerzenie klasy Thread

stworzenie klasy implementuj¡cej interfejs Runnable, którymo»e by¢ wykonany w osobnym w¡tku (Thread)

stworzenie klasy implementuj¡cej interfejs Callable, którymo»e by¢ wykonany w osobnym w¡tku (Thread)

Preferowane jest stosowanie rozszerze« interfejsów, poniewa» daj¡one du»o lepsz¡ elastyczno±¢, szczególnie je±li dojdziemy domomentu szeregowania w¡tków, utrzymywania staªej puli w¡tkówwykonuj¡cych si¦ w tle. Interfejsy Runnable i Callable s¡ do siebiebardzo podobne, jednak najwa»niejsz¡ ró»nic¡ jest to, »e Callablemo»e zwróci¢ w wyniku pewn¡ warto±¢, natomiast w przypadkuRunnable nie ma takiej mo»liwo±ci.

Radosªaw Klimek J¦zyk programowania Java

Page 10: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Klasa Thread

Podobnie jak wszystkie poj¦cia Javy, w¡tki reprezentowane s¡ przezobiekty okre±lonej klasy. W¡tki reprezentowane s¡ przez obiektyklasy Thread, która zawiera wszystkie metody do zarz¡dzaniaw¡tkami. Klasa Thread jest jedynym elementem Javy pozwalaj¡cymna zarz¡dzanie w¡tkami. Ka»dy w¡tek w pewnm momencie zaczynasi¦, wykonuje okre±lon¡ liczb¦ dziaªa«, po czym ko«czy si¦.

Radosªaw Klimek J¦zyk programowania Java

Page 11: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Metody klasy Thread

Metody klasy Thread dzielimy na

Metody statyczne � wywoªuje si¦ je bezpo±rednio z nazw¡klasy:

Thread . cu r r en tTh read ( )

Metody zwi¡zane z obiektami � nie s¡ metodami statycznymi,mo»na z nich korzysta¢ dopiero po utworzeniu obiektu klasyThread.

Radosªaw Klimek J¦zyk programowania Java

Page 12: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Metody statyczne � zestawienie

Metoda currentThread() � zwraca obiekt klasy Threadreprezentuj¡cy bie»¡cy w¡tek.

Metoda yield() � poleca systemowi czasu przebiegu Javyprzerwanie wykonywania bie»acego w¡tku i przekazanieprocesora nast¦pnemu oczekuj¡cemu w¡tkowi. Jest to jedynysposób uzyskania pewno±ci, »e w¡tki o najni»szych priorytetachb¦d¡ kiedykolwiek wykonane.

Metoda sleep(int n) � poleca systemowi czasu przebieguu±pienie bie»acego w¡tku na n milisekund. Po upªywie tegoczasu w¡tek b¦dzie gotowy do dziaªania.

Radosªaw Klimek J¦zyk programowania Java

Page 13: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Metody zwi¡zane z obiektami � zestawienie

Trzy podstawowe metody klasy Thread:

Metoda start() � poleca utworzenie i uruchomienie nowegow¡tku. Jego dziaªanie polega na wykonaniu metody run()nale»¡cej do obiektu wskazanego podczas tworzenia danegow¡tku. Niedozwolone jest wielokrotne wywoªywanie tej metodydla tego samego w¡tku.

Metoda run() � Jest to zasadnicza cze±¢ ka»dego w¡tku. Nienale»y ona do klasy Thread, jest to jedyna metoda interfejsuRunnable. Wywoªuje j¡ metoda Metoda start() popoprawnym utworzeniu nowego w¡tku. Zako«czenie dziaªaniametody run() oznacza zatrzymanie zwi¡zanego z ni¡ w¡tku.

Metoda inerrupt() � umo»liwia przerwanie dziaªania w¡tku.

Radosªaw Klimek J¦zyk programowania Java

Page 14: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Inne metody klasy Thread � zestawienie

Metoda suspend() � zawieszenie w¡tku

Metoda resume() � wznawienie wykonywania zawieszonegow¡tku

Metoda setPriority(int p) � Ustawia priorytet w¡tku

Metoda getPriority() � Pobiera i zwraca priorytet w¡tku

Metoda setName(String name) � Ustawia nazw¦ w¡tku

Metoda getName() � Pobiera i zwraca nazw¦ w¡tku

Metoda stop() � powoduje natychmiastowe zatrzymaniew¡tku. W¡tek przestaje istnie¢.

i inne: wait(), notify(), notifyAll(), isAlive(), join()...

Radosªaw Klimek J¦zyk programowania Java

Page 15: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Tworzenie w¡tków

Program korzystaj¡cy z wi¦cej ni» jednego w¡tku mo»emy utworzy¢na dwa sposoby:

Bezpo±rednio poprzez dziedziczenie klasy Thread

Po±rednio poprzez implementacj¦ interfejsu Runnable .

Radosªaw Klimek J¦zyk programowania Java

Page 16: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Dziedziczenie klasy Thread

Bezpo±rednie dziedziczenie z klasy Thread

1 c l a s s MyThread extends Thread {2 . . .3 pub l i c void run ( ) {4 . . .5 }6 }

Tworzenie obiektu i uruchamianie w¡tku:

1 MyThread t = new MyThread ( ) ;2 t . s t a r t ( ) ;

Radosªaw Klimek J¦zyk programowania Java

Page 17: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Implementacja Runnable

Po±rednie poprzez implementacj¦ interfejsu Runnable.

1 c l a s s MyThreadR implements Runnable {2 . . .3 pub l i c void run ( ) {4 . . .5 }6 }

Tworzenie obiektu i uruchamianie w¡tku:

1 MyThreadR r = new MyThreadR ( ) ;2 Thread t = new Thread ( r ) ;3 t . s t a r t ( ) ;

Wykorzystanie interfejsu jest szczególnie przydatne, gdy dana klasa(klasa w¡tku) dziedziczy ju» z innej klasy (w Javie nie mo»nadziedziczy¢ z dwóch ró»nych klas).

Radosªaw Klimek J¦zyk programowania Java

Page 18: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Tworzenie i uruchamianie w¡tków � przykªad

Przykªadowa implementacja interfejsu Runnable:1 p u b l i c c l a s s Watek1 imp l ement s Runnable {2 p u b l i c v o i d run ( ) {3 System . out . p r i n t l n ( " to j e s t watek imp l ementu jacy i n t e r f e j s Runnable " ) ;4 }5 }

Rozszerzenie klasy Thread:1 p u b l i c c l a s s Watek2 e x t e nd s Thread {2 p u b l i c v o i d run ( ) {3 System . out . p r i n t l n ( " to j e s t watek r o z s z e r z a j a c y k l a s e Thread" ) ;4 }5 }

A teraz tworzymy i uruchamiamy nasze w¡tki:1 p u b l i c c l a s s Uruchom {23 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {4 Watek1 w1 = new Watek1 ( ) ;5 Watek2 w2 = new Watek2 ( ) ;67 ( new Thread (w1 ) ) . s t a r t ( ) ;8 w2 . s t a r t ( ) ;910 }11 }

Radosªaw Klimek J¦zyk programowania Java

Page 19: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Omówienie przykªadu

Tworzymy dwa w¡tki w1 i w2. Pierwszy z nich to obiekt klasyimplementuj¡cej interfejs Runnable, drugi to obiekt klasydziedzicz¡cej z klasy Thread. Tutaj wida¢ podstawow¡ ró»nic¦pomi¦dzy obiema metodami tworzenia klas. Zaimplementowanieinterfejsu wymusza stworzenie obiektu Thread, któremu jakoparametr konstruktora dajemy obiekt implementuj¡cy Runnable.Dopiero tak utworzony obiekt posiada metod¦ start(), którauruchamia w¡tek. Drugie podej±cie powoduje i» nie musimytworzy¢ dodatkowego obiektu.Które podej±cie jest lepsze? Oczywi±cie poprzez implementacj¦interfejsu Runnable poniewa»:

opiera si¦ na interfejsach co jest znacznie bardziej elastyczn¡metod¡ ni» dziedziczenie.

nie zaburza hierarchii klas poprzez dziedziczenie z klasyThread.

Radosªaw Klimek J¦zyk programowania Java

Page 20: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Priorytety w¡tków

Java z ka»dym w¡tkiem programu kojarzy priorytet, informuj¡cy otym jak nale»y traktowa¢ w¡tek w stosunku do innych w¡tkówprogramu.Priorytet jest liczb¡ caªkowit¡ z zakresu od MIN_PRIORITY(1)do MAX_PRIORITY (10) . Domy±lnym priorytetem jestNORM_PRIORITY (5).Ogólna zasada mówi, »e w¡tki o wysokich priorytech powinny by¢wykonywane cz¦±ciej ni» w¡tki o niskich priorytetech. Doustawiania priorytetu w¡tku sªu»y metoda: setPriority(int p).

Radosªaw Klimek J¦zyk programowania Java

Page 21: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Synchronizacja

Tworz¡c w¡tki nale»y pami¦ta¢, »e wspóªdziel¡ one pomi¦dzy sob¡pami¦¢ i zasoby. Mo»e to prowadzi¢ do kolizji, a te do bª¦dów.Bª¦dy spowodowane przez kolizje jest bardzo ci¦»ko znale¹¢ iusun¡¢. Je»eli dwa albo wi¦cej w¡tków ubiega si¦ dowspóªdzielonych zasobów to musimy zapewni¢ im synchronizacj¦.W Javie realizowana jest ona za pomoc¡ wbudowanych elementówj¦zykowych, tzw monitorów, czyli obiektu u»ywanego jako blokady,umo»liwiaj¡cej wzajemne wykluczanie si¦ w¡tków. W danej chwilitylko jeden w¡tek mo»e znajdowa¢ si¦ w monitorze � pozostaªe s¡w zawieszeniu, czekaj¡c na jego zwolnienie.

Radosªaw Klimek J¦zyk programowania Java

Page 22: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Przykªad bez synchronizacji

1 p u b l i c c l a s s Uruchom {2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {3 Watek1 w1 = new Watek1 ( ) ;4 Watek2 w2 = new Watek2 ( ) ;56 ( new Thread (w1 ) ) . s t a r t ( ) ;7 ( new Thread (w2 ) ) . s t a r t ( ) ;8 }9 p u b l i c c l a s s Watek1 imp l ement s Runnable {10 p u b l i c v o i d run ( ) {11 f o r ( i n t i = 0 ; i <100000; i ++){12 System . out . p r i n t l n ( "W¡tek1" ) ;13 }14 }15 }1617 p u b l i c c l a s s Watek2 imp l ement s Runnable {18 p u b l i c v o i d run ( ) {19 f o r ( i n t i = 0 ; i <100000; i ++){20 System . out . p r i n t l n ( "W¡tek2" ) ;21 }22 }23 }24 }

Po uruchomieniu programu oka»e si¦, »e przez pewien czaswypisywane s¡ naprzemiennie oba napisy. Z tego wnosek, »e w¡tkiwykonywane s¡ naprzemiennie.

Radosªaw Klimek J¦zyk programowania Java

Page 23: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Synchronized

Je»eli istnieje jedna lub wiecej metod maj¡cych wpªyw nawewn¦trzy stan obiektu w ±rodowisku wielow¡tkowym nale»yzastosowa¢ mechanizm synchronizacji. Poprzez umieszczenie tychmetod w blokach synchronizowanych u»ywakj¡c sªowa kluczowegosynchronized . Ogólna posta¢ bloku synchronizownego:

1 s y n c h r o n i z e d ( o b i e k t ) i n s t r u k c j a

obiekt � to odwoªanie do dowolnego obiektu.

instrukcja � to najcz¦sciej instrukcja zªo»ona zawieraj¡cawywoªanie jednej z metod obiektu.

albo:1 s y n c h r o n i z e d metoda (){}

gdzie metoda jest synchronizowan¡ metod¡.

Radosªaw Klimek J¦zyk programowania Java

Page 24: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Przykªad z synchronizacj¡1 p u b l i c c l a s s Uruchom {2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {3 Watek1 w1 = new Watek1 ( ) ;4 Watek2 w2 = new Watek2 ( ) ;56 ( new Thread (w1 ) ) . s t a r t ( ) ;7 w2 . s t a r t ( ) ;8 }910 p u b l i c s t a t i c s y n c h r o n i z e d v o i d wyp i s z ( S t r i n g t e k s t ){11 f o r ( i n t i = 0 ; i <10000; i++)12 System . out . p r i n t l n ( i+" : "+t e k s t ) ;13 }14 }1516 p u b l i c c l a s s Watek117 imp l ement s Runnable {18 p u b l i c v o i d run ( ) {19 Uruchom . wyp i s z ( "Watek1" ) ;20 }21 }2223 p u b l i c c l a s s Watek224 e x t e nd s Thread {25 p u b l i c v o i d run ( ) {26 Uruchom . wyp i s z ( "Watek2" ) ;27 }28 }

Po uruchomieniu programu nie zaobserwujemy ju» wymieszania si¦tekstów pochodz¡cych z ró»nych w¡tków.

Radosªaw Klimek J¦zyk programowania Java

Page 25: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Wyj¡tki

Wyj¡tek jest to nietypowa sytuacja pojawiaj¡ca si¦ podczaswykonywania programun np. wyst¡pienie bª¦du polegaj¡cego napróbie otwarcia pliku, który nie istnieje.

Java posiada mechanizm obsªugi wyj¡tków. Mechanizm obsªugiwyj¡tków w Javie umo»liwia zaprogramowanie "wyj±cia" sytuacjikrytycznych, dzi¦ki czemu program nie zawiesi si¦ po wyst¡pieniubª¦du wykonuj¡c ci¡g operacji obsªuguj¡cych wyj¡tek. Wyst¡pieniesytuacji wyj¡tkowej przerywa "normalny" tok wykonania programu.

Radosªaw Klimek J¦zyk programowania Java

Page 26: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Obsªuga wyj¡tków

Czyli:

Wyj¡tek powstaje na skutek jakiego± nieoczekiwanego bª¦du.

Wyj¡tek jest zgªaszany (lub mówi¡c inaczej - sygnalizowany).

Wyj¡tek jest (mo»e lub musi by¢) obsªugiwany.

Radosªaw Klimek J¦zyk programowania Java

Page 27: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Brak jawnej obsªugi wyj¡tku � przykªad

Próba dzielenia przez zero:

1 p u b l i c c l a s s NoCatch {2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {3 i n t a = 1 , b = 0 , c = 0 ;4 c = a/b ;5 System . out . p r i n t l n ( c ) ;6 }7 }

powstaªy bª¡d (wyj¡tek) spowoduje zako«czenie programu, a JVMwypisze komunikat o jego przyczynie.

1 Excep t i on i n th r ead "main" j a v a . l ang . A r i t hme t i cE x c ep t i o n : / by z e r o2 at NoCatch . main ( NoCatch . j a v a : 6 )

Radosªaw Klimek J¦zyk programowania Java

Page 28: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Obsªuga wyj¡tków

W Javie do obsªugi wyj¡tków sªu»y pi¦¢ sªów kluczowych:

try � okre±la sekwencj¦ instrukcji, podczas których mo»ewyst¡pi¢ bª¡d.

catch � przechwytuje wyj¡tek okre±lonego typu

throw � sªu»y do generowania wyj¡tków okre±lonego typu

throws � okre±la list¦ wszystkich wyj¡tków generowanychprzez dan¡ metod¦

�nally � blok instrukcji do obsªugi wyj¡tków wykonywanyzawsze, niezale»nie od tego czy dla danego wyj¡tku istnieje czynie istnieje blok catch

Radosªaw Klimek J¦zyk programowania Java

Page 29: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Blok try ... catch

Do obsªugi wyj¡tków sªu»y blok try ... catch.1 t r y {2 b l ok i n s t r u k c j i mog¡cy spowodowa¢ wy j¡ t ek3 }4 ca t ch (Typ_Wyjatku_1 identy f i ka to r_Wyja tku_1 ) {5 i n s t r u k c j a obs ªug1 wyj¡tku_16 }7 ca t ch (Typ_Wyjatku_2 identy f i ka to r_Wyja tku_2 ) {8 i n s t r u k c j a obs ªug1 wyj¡tku_29 }10 ca t ch (Typ_Wyjatku_N identy f ikator_Wyjatku_N ) {11 i n s t r u k c j a obs ªug1 wyj¡tku_N12 }13 [ f i n a l l y i n s t r u k c j a_ob s ª u g i wy j¡ tku ]

Po try nast¦puje blok instrukcji mog¡cych spowodowa¢ wyj¡tek.Je»eli podczas ich wykonywania zostanie on wygenerowany,wykonywanie zostanie przerwane, a sterowanie przekazane do blokucatch. Tu sprawdzane jest, czy która± z tych instrukcji odpowiadawygenerowanemu wyj¡tkowi. Je±li tak, wykonany zostanie kod poniej wyst¦puj¡cy, je»eli nie to kod z bloku �nally (je»eli takiistnieje). Instrukcje z bloku �nally wykonywane s¡ zawsze.

Radosªaw Klimek J¦zyk programowania Java

Page 30: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Blok try ... catch

sekwencja wykonywania bloku try ... catch:

Wykonywane s¡ kolejne instrukcje bloku try.

Je±li przy wykonaniu której± z instrukcji zostanie zgªoszonywyj¡tek, wykonanie bloku try jest przerywane w miejscuzgªoszenia wyjatku.

Sterowanie przekazywane jest do pierwszej w kolejno±ciklauzuli catch, w której podana w nawiasach okr¡gªych posªowie catch klasa wyj¡tku pasuje do typu powstalegowyj¡tku, czyli klasa wyjatku jest taka sama jak klasapowstaªego wyj¡tku lub jest jej dowoln¡ nadklas¡.

Nale»y najpierw zapisywa¢ kluazulecatch z bardziejszczegóªowymi klasami wyj¡tków: np. najpierwFileNotFoundException, a pó¹niej IOException, bo klasaFileNotFoundException jest pochodna od IOException.

Radosªaw Klimek J¦zyk programowania Java

Page 31: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Blok try ... catch

Inne klauzule catch nie s¡ ju» wykonywane.

Obsªuguj¡ca wyj¡tek klauzula catch mo»e zrobi¢ wiele rzeczy:m.in. zmieni¢ sekwencj¦ sterowania (np. poprzez return). Je±linie zmienia sekwencji sterowania to wykonanie programub¦dzie kontynuowane od nast¦pnej instrukcji po bloku try.

Ale niezaleznie od tego czy wyj¡tek powstaª czy nie iniezale»nie od tego czy ew. obsªuguj¡ca go klauzula catchzwraca sterowanie czy nie zawsze zaraz po zako«czeniemdziaªania bloku try wykonana zostanie klauzula �nally (o ilejest).

Radosªaw Klimek J¦zyk programowania Java

Page 32: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Przykªad � dzielenie przez zero

1 c l a s s d z i e l e n i e_p r z e z_ze r o2 {3 p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] )4 {5 i n t b = 0 ;6 i n t a = 100 ;7 i n t c ;8 S t r i n g wynik ;9 t r y10 {11 c = a / b ;12 wynik = "" + c ;13 }14 c a t ch15 {16 ( A r i t hme t i cE x c e p t i o n e )17 System . out . p r i n t l n ( "Niedozwolone d z i e l e n i e p r z e z ze r o " ) ;18 wynik = "∗∗∗" ;19 }20 System . out . p r i n t l n ( wynik )21 }22 }

Radosªaw Klimek J¦zyk programowania Java

Page 33: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Przykªad � dzielenie przez zero

W tym przypadku, wykonanie instrukcji c = a/b spowodujepowstanie wyj¡tku (dzielenie przez zero), a poniewa» instrukcja taznajduje si¦ w bloku try, w którym znajduje si¦ blok catch zodpowiednim typem wyj¡tku, to je»eli b = 0

sterowanie zostanie przekazane do kodu w catch

wyprowadzony zostanie napis "Niedozwolone dzielenie przezzero"

pod zmienn¡ wynik podstawione zostanie "***"

zostanie wypisana zmienna wynik czyli "***"

Gdyby zmienna b nie miaªa warto±ci zero, wyj¡tek by nie powstaª,kod z bloku catch nie zostaª by wykonany i wy±wietlony by zostaªwynik dzielenia a/b.

Radosªaw Klimek J¦zyk programowania Java

Page 34: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

wyj¡tki - wery�kacja danych

Mechanizm obsªugi wyj¡tków mo»e by¢ wykorzystywany w bardzoró»ny sposób. Typowym przykªadem jest wery�kacjawprowadzanych danych. I tak od u»ytkownika »¡damywprowadzania liczb caªkowitych, a nast¦pnie za pomoc¡ metodyparseInt przeksztaªcamy ich znakow¡ reprezentacj¦ na binarn¡.Je»eli wprowadzony napis nie reprezentuje liczby caªkowitej, topowstaje wyj¡tek NumberFormatException. Powinnien by¢ onzawsze obsªugiwany. Pokazuje to nast¦puj¡cy program.

Radosªaw Klimek J¦zyk programowania Java

Page 35: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

wyj¡tki - wery�kacja danych

1 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {23 S t r i n g s1 = JOptionPane . showInputD ia l og ( "Podaj p i e rw s z ¡ l i c z b ¦ " ) ;4 i f ( s1 != n u l l ) {5 S t r i n g s2 = JOptionPane . showInputD ia l og ( "Podaj drug¡ l i c z b ¦ " ) ;6 i f ( s2 != n u l l ) {7 i n t n1 ;8 i n t n2 ;9 t r y {10 n1 = I n t e g e r . p a r s e I n t ( s1 ) ;11 n2 = I n t e g e r . p a r s e I n t ( s2 ) ;12 } ca t ch ( NumberFormatException exc ) {13 System . out . p r i n t l n ( "Bª¦dne dane" ) ;14 r e t u r n ;15 }16 JOptionPane . showMessageDia log ( n u l l , "Suma : " + ( n1 + n2 ) ) ;17 }18 }19 }

Radosªaw Klimek J¦zyk programowania Java

Page 36: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Klasa wyj¡tków

Wyj¡tki s¡ obiektami klas wyj¡tków. NazwyNumberFormatException, ArithmeticException itd. s¡nazwami klas.

Zmienna exc w bloku catch - zawiera referencj¦ do obiektuodpowiedniej klasy wyj¡tku.

Radosªaw Klimek J¦zyk programowania Java

Page 37: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Klasa Throwable

Klasy wyj¡tków tworz¡ do±¢ rozbudowan¡ hierarchi¦ dziedzczeniaNadrz¦dn¡ klas¡ reprezentuj¡c¡ wyj¡tki jest klasa Throwable.Ka»da klasa wyst¦puj¡ca w bloku try ... catch jest jedn¡ z podklasklasy Throwable. Ma ona dwie bezpo±rednie podklasy:

Exception � u»ywa si¦ jej z wyj¡tkami generowanymi iprzechwytywanymi przez system.

Error � okre±la wyj¡tki, które w normalnej sytuacji niepowinny by¢ przechwytywane (s¡ to bardzo powa»ne bª¦dy).

Radosªaw Klimek J¦zyk programowania Java

Page 38: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Klasa RunTimeException

Szczególn¡ podklas¡ klasy Exception jest klasaRunTimeException dla wyj¡tków spowodowanych przez systemczasu przebiegu Javy, s¡ one generowane automatycznie.Podstawowa ró»nica pomi¦dzy tymi klasami polega na tym, »ewyj¡tki klas pochodnych od Exception. ale nieRuntimeException s¡ tzw. wyj¡tkami kontrolowanymi, cooznacza, »e musimy zapewni¢ ich obsªug¦ (kompilator zgªosi bª¡d,je±li tego nie zrobimy). Pozostaªych wyj¡tków obsªugiwa¢ niemusimy (ale mo»emy)

Radosªaw Klimek J¦zyk programowania Java

Page 39: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Zgªaszanie wyj¡tków � instrukcja Throw

Oprócz bloku try...catch Java dostarcza jescze inny sposóbezgªaszania wyj¡tków. Jest to instrukcja throw. Jest szczególnieprzydatna w przypadku wyj¡tków, których nie da si¦ obsªu»y¢, ichobsªuga nie ma sensu, lub po prostu ich wyst¡pienie mo»espowodowa¢ nieprawidªow¡ prac¦ w dalszych etapach programu.Jej skªadnia :

1 typ nazwa_metody ( ) th rows typ_wyj¡tku1 , typ_wyj¡tku2 , . . .2 {3 kod . . .4 throw new typ_wyjatku_1 ( ) ;5 throw new typ_wyjatku_2 ( ) ;6 kod7 }

Radosªaw Klimek J¦zyk programowania Java

Page 40: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Throws

W nagªówku metody musimy zadeklarowa¢, korzystaj¡c z instrukcjithrows, list¦ wyj¡tków jakie dana metoda mo»e wygenerowa¢.Pó¹niej w kodzie danej metody mo»na je zgªosi¢ (zazwyczaj np winstrukcji if) korzystaj¡c z instrukcji throw. Zgªasza¢ w ten sposóbmo»na wszystkie rodzaje wyj¡tków, czyli obiekty klas, którepo±rednio, lub bezpo±rednio dziedzicz¡ z klasy Throwable.

Kompilator wymaga deklarowania wyj¡tków reprezentowanychprzez klas¦ Exception oraz wi¦kszo±¢ jej podklas.

wyj¡tki klasy Error i RunTimeException oraz wszystkie jejpodklasy nie wymagaj¡ deklarowania.

Radosªaw Klimek J¦zyk programowania Java

Page 41: J¦zyk programowania JAAV c 2011-12 Radosªaw Klimekhome.agh.edu.pl/~rklimek/paw/Java4.pdfSystemy wielow¡tkowe Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizm

Throw � przyklad

Program dziel¡cy liczb¦ 1000 przez liczb¦ podan¡ przezu»ytkownika.

1 impo r t j a v a . u t i l . Scanner ;23 p u b l i c c l a s s Main {4 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a g r s ) th rows Ar i t hme t i cE x c e p t i o n5 {6 doub l e l i c zba_1 = 1000 ;7 doub l e l i c zba_2 ;8 doub l e i l o r a z ;9 Scanner d z i e l n i k = new Scanner ( System . i n ) ;10 System . out . p r i n t ( "Podaj d z i e l n i k : " ) ;11 l i c zba_2 = d z i e l n i k . nextDoub le ( ) ;12 i f ( l i c zba_2 == 0)13 throw new Ar i t hme t i cE x c e p t i o n ( "Nie mozna d z i e l i ¢ p r z e z 0" ) ;14 e l s e15 {16 i l o r a z = l i c zba_1 / l i c zba_2 ;17 System . out . p r i n t l n ( "wynik d z i e l e n i a : "+ i l o r a z ) ;18 }19 }20 }

Radosªaw Klimek J¦zyk programowania Java