Java. Przewodnik dla początkujących. Wydanie V · Przykad u ycia metod wa it() i notify()...

58

Transcript of Java. Przewodnik dla początkujących. Wydanie V · Przykad u ycia metod wa it() i notify()...

Tytuł oryginału: Java, A Beginner's Guide, 5th Edition

Tłumaczenie: Jaromir Senczyk

ISBN: 978-83-246-3919-9

Original edition copyright © 2012 by The McGraw-Hill Companies, Inc.All rights reserved.

Polish edition copyright © 2012 by HELION SAAll rights reserved.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher.

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji.

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.

Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce.

Wydawnictwo HELIONul. Kościuszki 1c, 44-100 GLIWICEtel. 32 231 22 19, 32 230 98 63e-mail: [email protected]: http://helion.pl (księgarnia internetowa, katalog książek)

Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/javpp5.zip

Drogi Czytelniku!Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/javpp5Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

Printed in Poland.

• Kup książkę• Poleć książkę • Oceń książkę

• Księgarnia internetowa• Lubię to! » Nasza społeczność

Spis tre�ciO autorze .................................................................................................11

O redaktorze technicznym ........................................................................11

Wst�p ......................................................................................................13

Rozdzia� 1. Podstawy Javy .........................................................................................19Pochodzenie Javy ........................................................................................................................20

Java a j�zyki C i C++ ............................................................................................................21Java a C# ...............................................................................................................................22

Java a Internet ..............................................................................................................................22Aplety Java ............................................................................................................................22Bezpiecze�stwo .....................................................................................................................23Przeno�no�� ...........................................................................................................................23

Magiczny kod bajtowy ................................................................................................................24Terminologia Javy .......................................................................................................................25Programowanie obiektowe ..........................................................................................................26

Hermetyzacja .........................................................................................................................27Polimorfizm ...........................................................................................................................28Dziedziczenie ........................................................................................................................28

Java Development Kit .................................................................................................................29Pierwszy prosty program .............................................................................................................30

Wprowadzenie tekstu programu ............................................................................................30Kompilowanie programu .......................................................................................................31Pierwszy program wiersz po wierszu ....................................................................................31

Obs�uga b��dów sk�adni ...............................................................................................................34Drugi prosty program ..................................................................................................................35Inne typy danych .........................................................................................................................37Przyk�ad 1.1. Zamiana galonów na litry ......................................................................................38Dwie instrukcje steruj�ce .............................................................................................................39

Instrukcja if ...........................................................................................................................40P�tla for .................................................................................................................................41

Bloki kodu ...................................................................................................................................43�rednik i pozycja kodu w wierszu ...............................................................................................44Wci�cia ........................................................................................................................................45Przyk�ad 1.2. Ulepszony konwerter galonów na litry ..................................................................45S�owa kluczowe j�zyka Java .......................................................................................................46Identyfikatory ..............................................................................................................................47Biblioteki klas ..............................................................................................................................48Test sprawdzaj�cy .......................................................................................................................48

4 Java. Przewodnik dla pocz�tkuj�cych

Rozdzia� 2. Typy danych i operatory ............................................................................49Dlaczego typy danych s� tak wane ............................................................................................50Typy podstawowe ........................................................................................................................50

Typy ca�kowite ......................................................................................................................51Typy zmiennoprzecinkowe ...................................................................................................52Znaki .....................................................................................................................................53

Typ logiczny ................................................................................................................................54Przyk�ad 2.1. Jak daleko uderzy� piorun? ....................................................................................55Litera�y ........................................................................................................................................56

Litera�y szesnastkowe, ósemkowe i binarne ..........................................................................57Specjalne sekwencje znaków ................................................................................................57Litera�y �a�cuchowe ..............................................................................................................58

Zmienne .......................................................................................................................................59Inicjalizacja zmiennej ............................................................................................................59Dynamiczna inicjalizacja ......................................................................................................60

Zasi�g deklaracji i czas istnienia zmiennych ...............................................................................60Operatory .....................................................................................................................................63Operatory arytmetyczne ..............................................................................................................63

Inkrementacja i dekrementacja ..............................................................................................65Operatory relacyjne i logiczne .....................................................................................................66Warunkowe operatory logiczne ...................................................................................................67Operator przypisania ....................................................................................................................69Skrótowe operatory przypisania ..................................................................................................69Konwersje typów w instrukcjach przypisania .............................................................................71Rzutowanie typów niezgodnych ..................................................................................................72Priorytet operatorów ....................................................................................................................74Przyk�ad 2.2. Tabela prawdy dla operatorów logicznych ............................................................74Wyraenia ....................................................................................................................................75

Konwersja typów w wyraeniach ..........................................................................................76Odst�py i nawiasy .................................................................................................................77

Test sprawdzaj�cy .......................................................................................................................78

Rozdzia� 3. Instrukcje steruj�ce .................................................................................79Wprowadzanie znaków z klawiatury ...........................................................................................79Instrukcja if ..................................................................................................................................81Zagniedanie instrukcji if ..........................................................................................................82Drabinka if-else-if .......................................................................................................................83Instrukcja switch ..........................................................................................................................84Zagniedanie instrukcji switch ...................................................................................................88Przyk�ad 3.1. Rozpoczynamy budow� systemu pomocy .............................................................88P�tla for .......................................................................................................................................90Wariacje na temat p�tli for ..........................................................................................................92Brakuj�ce elementy .....................................................................................................................93

P�tla niesko�czona ................................................................................................................94P�tle bez cia�a ..............................................................................................................................94Deklaracja zmiennych steruj�cych wewn�trz p�tli ......................................................................95Rozszerzona p�tla for ..................................................................................................................96P�tla while ...................................................................................................................................96P�tla do-while ..............................................................................................................................97Przyk�ad 3.2. Ulepszamy system pomocy ...................................................................................99Przerywanie p�tli instrukcj� break .............................................................................................102Zastosowanie break jako formy goto .........................................................................................104Zastosowanie instrukcji continue ...............................................................................................108Przyk�ad 3.3. Ko�cowa wersja systemu pomocy .......................................................................109

Spis tre�ci 5

P�tle zagniedone ....................................................................................................................112Test sprawdzaj�cy .....................................................................................................................113

Rozdzia� 4. Wprowadzenie do klas, obiektów i metod ................................................115Podstawy klas ............................................................................................................................116

Ogólna posta� klasy ............................................................................................................116Definiowanie klasy ..............................................................................................................117

Jak powstaj� obiekty ..................................................................................................................120Referencje obiektów i operacje przypisania ..............................................................................120Metody ......................................................................................................................................121

Dodajemy metod� do klasy Vehicle ....................................................................................122Powrót z metody ........................................................................................................................124Zwracanie warto�ci ....................................................................................................................125Stosowanie parametrów .............................................................................................................127

Dodajemy sparametryzowan� metod� do klasy Vehicle .....................................................128Przyk�ad 4.1. System pomocy jako klasa ...................................................................................130Konstruktory ..............................................................................................................................135Konstruktory z parametrami ......................................................................................................136Dodajemy konstruktor do klasy Vehicle ....................................................................................137Operator new .............................................................................................................................138Odzyskiwanie nieuytków i metoda finalize() ...........................................................................139Metoda finalize() .......................................................................................................................139Przyk�ad 4.2. Ilustracja dzia�ania odzyskiwania nieuytków i metody finalize() ......................140S�owo kluczowe this ..................................................................................................................142Test sprawdzaj�cy .....................................................................................................................144

Rozdzia� 5. Wi�cej typów danych i operatorów ..........................................................145Tablice .......................................................................................................................................145

Tablice jednowymiarowe ....................................................................................................146Przyk�ad 5.1. Sortowanie tablicy ...............................................................................................149Tablice wielowymiarowe ..........................................................................................................151

Tablice dwuwymiarowe ......................................................................................................151Tablice nieregularne ..................................................................................................................152

Tablice o trzech i wi�cej wymiarach ...................................................................................153Inicjalizacja tablic wielowymiarowych ...............................................................................153

Alternatywna sk�adnia deklaracji tablic .....................................................................................155Przypisywanie referencji tablic ..................................................................................................155Wykorzystanie sk�adowej length ...............................................................................................156Przyk�ad 5.2. Klasa Queue .........................................................................................................158Styl for-each p�tli for .................................................................................................................162

Iteracje w tablicach wielowymiarowych .............................................................................165Zastosowania rozszerzonej p�tli for ....................................................................................166

a�cuchy znaków ......................................................................................................................167Tworzenie �a�cuchów ..........................................................................................................167Operacje na �a�cuchach .......................................................................................................168Tablice �a�cuchów ...............................................................................................................170a�cuchy s� niezmienne .....................................................................................................171a�cuchy steruj�ce instrukcj� switch ..................................................................................172

Wykorzystanie argumentów wywo�ania programu ...................................................................173Operatory bitowe .......................................................................................................................175

Operatory bitowe AND, OR, XOR i NOT ..........................................................................175Operatory przesuni�cia ........................................................................................................179Skrótowe bitowe operatory przypisania ..............................................................................181

Przyk�ad 5.3. Klasa ShowBits ...................................................................................................182

6 Java. Przewodnik dla pocz�tkuj�cych

Operator ? ..................................................................................................................................184Test sprawdzaj�cy .....................................................................................................................186

Rozdzia� 6. Wi�cej o metodach i klasach ..................................................................189Kontrola dost�pu do sk�adowych klasy .....................................................................................189

Modyfikatory dost�pu w Javie ............................................................................................190Przyk�ad 6.1. Ulepszamy klas� Queue .......................................................................................194Przekazywanie obiektów metodom ...........................................................................................195

Sposób przekazywania argumentów ...................................................................................196Zwracanie obiektów ..................................................................................................................199Przeci�anie metod ....................................................................................................................201Przeci�anie konstruktorów .......................................................................................................205Przyk�ad 6.2. Przeci�amy konstruktor klasy Queue .................................................................207Rekurencja .................................................................................................................................210S�owo kluczowe static ...............................................................................................................212

Bloki static ..........................................................................................................................215Przyk�ad 6.3. Algorytm Quicksort .............................................................................................216Klasy zagniedone i klasy wewn�trzne ....................................................................................218Zmienne liczby argumentów .....................................................................................................221

Metody o zmiennej liczbie argumentów ..............................................................................222Przeci�anie metod o zmiennej liczbie argumentów ...........................................................225Zmienna liczba argumentów i niejednoznaczno�� ..............................................................226

Test sprawdzaj�cy .....................................................................................................................227

Rozdzia� 7. Dziedziczenie .........................................................................................229Podstawy dziedziczenia .............................................................................................................230Dost�p do sk�adowych a dziedziczenie ......................................................................................232Konstruktory i dziedziczenie .....................................................................................................235Uycie s�owa kluczowego super do wywo�ania konstruktora klasy bazowej ............................237Uycie s�owa kluczowego super do dost�pu do sk�adowych klasy bazowej .............................240Przyk�ad 7.1. Tworzymy hierarchi� klas Vehicle ......................................................................241Wielopoziomowe hierarchie klas ...............................................................................................244Kiedy wywo�ywane s� konstruktory? ........................................................................................247Referencje klasy bazowej i obiekty klasy pochodnej .................................................................248Przes�anianie metod ...................................................................................................................252Przes�anianie metod i polimorfizm ............................................................................................255Po co przes�ania� metody? ........................................................................................................257

Zastosowanie przes�aniania metod w klasie TwoDShape ...................................................257Klasy abstrakcyjne .....................................................................................................................260S�owo kluczowe final ................................................................................................................264

final zapobiega przes�anianiu ..............................................................................................264final zapobiega dziedziczeniu ..............................................................................................265Uycie final dla zmiennych sk�adowych .............................................................................265

Klasa Object ..............................................................................................................................267Test sprawdzaj�cy .....................................................................................................................268

Rozdzia� 8. Pakiety i interfejsy .................................................................................269Pakiety .......................................................................................................................................269

Definiowanie pakietu ..........................................................................................................270Wyszukiwanie pakietów i zmienna CLASSPATH ..............................................................271Prosty przyk�ad pakietu .......................................................................................................272

Pakiety i dost�p do sk�adowych .................................................................................................273Przyk�ad dost�pu do pakietu ................................................................................................274

Sk�adowe protected ...................................................................................................................275Import pakietów .........................................................................................................................277

Spis tre�ci 7

Biblioteka klas Java uywa pakietów ........................................................................................279Interfejsy ....................................................................................................................................279Implementacje interfejsów .........................................................................................................281Referencje interfejsu ..................................................................................................................284Przyk�ad 8.1. Tworzymy interfejs Queue ..................................................................................286Zmienne w interfejsach .............................................................................................................290Interfejsy mog� dziedziczy� ......................................................................................................291Test sprawdzaj�cy .....................................................................................................................293

Rozdzia� 9. Obs�uga wyj�tków ..................................................................................295Hierarchia wyj�tków ..................................................................................................................296Podstawy obs�ugi wyj�tków ......................................................................................................296

S�owa kluczowe try i catch ..................................................................................................297Prosty przyk�ad wyj�tku ......................................................................................................298

Konsekwencje nieprzechwycenia wyj�tku ................................................................................300Wyj�tki umoliwiaj� obs�ug� b��dów .................................................................................301Uycie wielu klauzul catch ..................................................................................................302

Przechwytywanie wyj�tków klas pochodnych ..........................................................................303Zagniedanie bloków try .........................................................................................................304Generowanie wyj�tku ................................................................................................................305

Powtórne generowanie wyj�tku ..........................................................................................306Klasa Throwable ........................................................................................................................307Klauzula finally .........................................................................................................................309Uycie klauzuli throws ..............................................................................................................311Nowo�ci w JDK 7 ......................................................................................................................312Wyj�tki wbudowane w Jav� ......................................................................................................313Tworzenie klas pochodnych wyj�tków ......................................................................................315Przyk�ad 9.1. Wprowadzamy wyj�tki w klasie Queue ...............................................................317Test sprawdzaj�cy .....................................................................................................................320

Rozdzia� 10. Obs�uga wej�cia i wyj�cia .......................................................................323Strumienie wej�cia i wyj�cia .....................................................................................................324Strumienie bajtowe i strumienie znakowe .................................................................................324Klasy strumieni bajtowych ........................................................................................................325Klasy strumieni znakowych .......................................................................................................326Strumienie predefiniowane ........................................................................................................326Uywanie strumieni bajtowych .................................................................................................327

Odczyt wej�cia konsoli ........................................................................................................328Zapis do wyj�cia konsoli .....................................................................................................329

Odczyt i zapis plików za pomoc� strumieni bajtowych .............................................................330Odczyt z pliku .....................................................................................................................330Zapis w pliku .......................................................................................................................334

Automatyczne zamykanie pliku .................................................................................................336Odczyt i zapis danych binarnych ...............................................................................................339Przyk�ad 10.1. Narz�dzie do porównywania plików .................................................................341Pliki o dost�pie swobodnym ......................................................................................................343Strumienie znakowe ..................................................................................................................345

Odczyt konsoli za pomoc� strumieni znakowych ................................................................345Obs�uga wyj�cia konsoli za pomoc� strumieni znakowych .................................................349

Obs�uga plików za pomoc� strumieni znakowych .....................................................................350Klasa FileWriter ..................................................................................................................350Klasa FileReader .................................................................................................................351

Zastosowanie klas opakowuj�cych do konwersji �a�cuchów numerycznych ............................352Przyk�ad 10.2. System pomocy wykorzystuj�cy pliki ...............................................................355Test sprawdzaj�cy .....................................................................................................................361

8 Java. Przewodnik dla pocz�tkuj�cych

Rozdzia� 11. Programowanie wielow�tkowe ................................................................363Podstawy wielow�tkowo�ci .......................................................................................................364Klasa Thread i interfejs Runnable .............................................................................................365Tworzenie w�tku .......................................................................................................................365

Drobne usprawnienia ...........................................................................................................369Przyk�ad 11.1. Tworzymy klas� pochodn� klasy Thread ...........................................................370Tworzenie wielu w�tków ...........................................................................................................372Jak ustali�, kiedy w�tek zako�czy� dzia�anie? ...........................................................................375Priorytety w�tków .....................................................................................................................378Synchronizacja ..........................................................................................................................380Synchronizacja metod ................................................................................................................381Synchronizacja instrukcji ..........................................................................................................384Komunikacja mi�dzyw�tkowa ...................................................................................................386

Przyk�ad uycia metod wait() i notify() ...............................................................................387Wstrzymywanie, wznawianie i ko�czenie dzia�ania w�tków ....................................................392Przyk�ad 11.2. Wykorzystanie g�ównego w�tku ........................................................................396Test sprawdzaj�cy .....................................................................................................................397

Rozdzia� 12. Typy wyliczeniowe, automatyczne opakowywanie,import sk�adowych statycznych i adnotacje .............................................399Wyliczenia .................................................................................................................................400

Podstawy wylicze� ..............................................................................................................400Wyliczenia s� klasami ...............................................................................................................403Metody values() i valueOf() ......................................................................................................403Konstruktory, metody, zmienne instancji a wyliczenia .............................................................404

Dwa wane ograniczenia .....................................................................................................406Typy wyliczeniowe dziedzicz� po klasie Enum ........................................................................406Przyk�ad 12.1. Komputerowo sterowana sygnalizacja �wietlna ................................................408Automatyczne opakowywanie ...................................................................................................413Typy opakowuj�ce .....................................................................................................................413Podstawy automatycznego opakowywania ................................................................................415Automatyczne opakowywanie i metody ....................................................................................416Automatyczne opakowywanie i wyraenia ................................................................................418

Przestroga ............................................................................................................................419Import sk�adowych statycznych .................................................................................................420Adnotacje (metadane) ................................................................................................................422Test sprawdzaj�cy .....................................................................................................................425

Rozdzia� 13. Generyczno�� .........................................................................................427Podstawy generyczno�ci ............................................................................................................428Prosty przyk�ad generyczno�ci ..................................................................................................428

Generyczno�� dotyczy tylko obiektów ................................................................................432Typy generyczne róni� si� dla rónych argumentów .........................................................432Klasa generyczna o dwóch parametrach ..............................................................................433Ogólna posta� klasy generycznej ........................................................................................434

Ograniczanie typów ...................................................................................................................434Stosowanie argumentów wieloznacznych .................................................................................438Ograniczanie argumentów wieloznacznych ...............................................................................440Metody generyczne ...................................................................................................................443Konstruktory generyczne ...........................................................................................................445Interfejsy generyczne .................................................................................................................445Przyk�ad 13.1. Generyczna klasa Queue ....................................................................................448Typy surowe i tradycyjny kod ...................................................................................................452Wnioskowanie typów i operator diamentowy ...........................................................................455Wymazywanie ...........................................................................................................................456

Spis tre�ci 9

B��dy niejednoznaczno�ci .........................................................................................................457Ograniczenia zwi�zane z generyczno�ci� ..................................................................................458

Zakaz tworzenia instancji parametru okre�laj�cego typ ......................................................458Ograniczenia dla sk�adowych statycznych ..........................................................................458Ograniczenia tablic generycznych .......................................................................................459Ograniczenia zwi�zane z wyj�tkami ...................................................................................460

Dalsze studiowanie zagadnienia generyczno�ci .........................................................................460Test sprawdzaj�cy .....................................................................................................................461

Rozdzia� 14. Aplety, zdarzenia i pozosta�e s�owa kluczowe ..........................................463Podstawy apletów ......................................................................................................................464Organizacja apletów i podstawowe elementy ............................................................................467Architektura apletu ....................................................................................................................467Kompletny szkielet apletu .........................................................................................................468Rozpocz�cie i zako�czenie dzia�ania apletu ..............................................................................469��danie odrysowania .................................................................................................................470

Metoda update() ..................................................................................................................471Przyk�ad 14.1. Prosty aplet wy�wietlaj�cy baner .......................................................................471Wykorzystanie okna statusu ......................................................................................................475Parametry apletów .....................................................................................................................475Klasa Applet ..............................................................................................................................477Obs�uga zdarze� ........................................................................................................................479Model delegacji zdarze� ............................................................................................................479Zdarzenia ...................................................................................................................................479

�ród�a zdarze� .....................................................................................................................479S�uchacze zdarze� ...............................................................................................................480Klasy zdarze� ......................................................................................................................480Interfejsy s�uchaczy zdarze� ................................................................................................480

Wykorzystanie modelu delegacji zdarze� ..................................................................................481Obs�uga zdarze� myszy .......................................................................................................482Prosty aplet obs�uguj�cy zdarzenia myszy ..........................................................................483

Inne s�owa kluczowe Javy .........................................................................................................486Modyfikatory transient i volatile .........................................................................................486Operator instanceof .............................................................................................................486S�owo kluczowe strictfp ......................................................................................................487S�owo kluczowe assert ........................................................................................................487Metody natywne ..................................................................................................................488

Test sprawdzaj�cy .....................................................................................................................490

Rozdzia� 15. Wprowadzenie do Swing .........................................................................491Pochodzenie i filozofia Swing ...................................................................................................492Komponenty i kontenery ...........................................................................................................494

Komponenty ........................................................................................................................494Kontenery ............................................................................................................................495Panele kontenerów szczytowych .........................................................................................495

Menedery uk�adu .....................................................................................................................496Pierwszy program wykorzystuj�cy Swing .................................................................................497

Pierwszy program Swing wiersz po wierszu .......................................................................498Komponent JButton ...................................................................................................................502Komponent JTextField ..............................................................................................................506Komponent JCheckBox .............................................................................................................509Komponent JList .......................................................................................................................512Przyk�ad 15.1. Porównywanie plików — aplikacja Swing ........................................................516Wykorzystanie anonimowych klas wewn�trznych do obs�ugi zdarze� .....................................521Aplety Swing .............................................................................................................................522

10 Java. Przewodnik dla pocz�tkuj�cych

Co dalej? ....................................................................................................................................524Test sprawdzaj�cy .....................................................................................................................525

Dodatek A Rozwi�zania testów sprawdzaj�cych .......................................................527Rozdzia� 1. Podstawy Javy ........................................................................................................527Rozdzia� 2. Typy danych i operatory .........................................................................................529Rozdzia� 3. Instrukcje steruj�ce .................................................................................................531Rozdzia� 4. Wprowadzenie do klas, obiektów i metod ..............................................................533Rozdzia� 5. Wi�cej typów danych i operatorów ........................................................................535Rozdzia� 6. Wi�cej o metodach i klasach ..................................................................................538Rozdzia� 7. Dziedziczenie .........................................................................................................543Rozdzia� 8. Pakiety i interfejsy ..................................................................................................545Rozdzia� 9. Obs�uga wyj�tków ..................................................................................................546Rozdzia� 10. Obs�uga wej�cia i wyj�cia .....................................................................................549Rozdzia� 11. Programowanie wielow�tkowe .............................................................................552Rozdzia� 12. Typy wyliczeniowe, automatyczne opakowywanie,

import sk�adowych statycznych i adnotacje ..........................................................554Rozdzia� 13. Generyczno�� .......................................................................................................558Rozdzia� 14. Aplety, zdarzenia i pozosta�e s�owa kluczowe ......................................................562Rozdzia� 15. Wprowadzenie do Swing ......................................................................................567

Dodatek B Komentarze dokumentacyjne ..................................................................573Znaczniki javadoc ......................................................................................................................573

@author ...............................................................................................................................574{@code} ..............................................................................................................................575@deprecated ........................................................................................................................575{@docRoot} ........................................................................................................................575@exception .........................................................................................................................575{@inheritDoc} ....................................................................................................................575{@link} ...............................................................................................................................575{@linkplain} .......................................................................................................................576{@literal} ............................................................................................................................576@param ...............................................................................................................................576@return ...............................................................................................................................576@see ....................................................................................................................................576@serial ................................................................................................................................577@serialData .........................................................................................................................577@serialField ........................................................................................................................577@since .................................................................................................................................577@throws ..............................................................................................................................577{@value} .............................................................................................................................578@version .............................................................................................................................578

Ogólna posta� komentarza dokumentacyjnego ..........................................................................578Wynik dzia�ania programu javadoc ...........................................................................................579Przyk�ad uycia komentarzy dokumentacyjnych .......................................................................579

Skorowidz ..............................................................................................581

Rozdzia� 11.

Programowaniewielow�tkowe

W tym rozdziale poznasz:

� podstawy wielow�tkowo�ci,

� klas� Thread i interfejs Runnable,

� tworzenie w�tku,

� tworzenie wielu w�tków,

� sposób ustalania zako�czenia w�tku,

� korzystanie z priorytetów w�tków,

� synchronizacj� w�tków,

� synchronizacj� metod,

� synchronizacj� bloków,

� komunikacj� mi�dzyw�tkow�,

� wstrzymywanie, wznawianie i ko�czenie dzia�ania w�tków.

Chocia Java dostarcza programistom wielu innowacyjnych moliwo�ci, to z pewno�ci� jedn�z najbardziej ekscytuj�cych jest obs�uga programowania wielow�tkowego. Program wie-low�tkowy zawiera dwie lub wi�cej cz��ci, które mog� dzia�a� równolegle. Kad� z tychcz��ci nazywamy w�tkiem, a kady w�tek definiuje osobn� �ciek� wykonania. Wielow�tko-wo�� jest zatem szczególn� form� wielozadaniowo�ci.

364 Java. Przewodnik dla pocz�tkuj�cych

Podstawy wielow�tkowo�ciIstniej� dwa podstawowe typy wielozadaniowo�ci, z których jeden opiera si� na procesach,a drugi wykorzystuje w�tki. Wane jest, aby� zrozumia� rónice mi�dzy nimi. Proces odpo-wiada w zasadzie wykonywanemu programowi. Zatem wielozadaniowo�� wykorzystuj�caprocesy umoliwia Twojemu komputerowi równoleg�e wykonywanie dwóch lub wi�cej pro-gramów. Wykorzystanie procesów umoliwi Ci na przyk�ad uruchomienie kompilatora Javyw tym samym czasie, gdy piszesz kod ród�owy w edytorze lub przegl�dasz strony w Internecie.W przypadku wielozadaniowo�ci wykorzystuj�cej procesy program jest najmniejsz� jednostk�kodu podlegaj�c� szeregowaniu do wykonania przez procesor.

W drugim rodzaju wielozadaniowo�ci najmniejsz� jednostk� kodu szeregowan� przez systemjest w�tek. Oznacza to, e pojedynczy program moe równocze�nie wykonywa� dwa lub wi�cejw�tków. Na przyk�ad edytor tekstu moe w tym samym czasie formatowa� jeden tekst i dru-kowa� inny, pod warunkiem e obie akcje s� wykonywane przez osobne w�tki. Chocia Javawykorzystuje �rodowiska wielozadaniowe oparte na procesach, to nie umoliwia sterowaniaich dzia�aniem. W przypadku w�tków sprawy maj� si� inaczej.

Podstawow� zalet� wielow�tkowo�ci jest moliwo�� tworzenia efektywnie dzia�aj�cych pro-gramów, poniewa wielow�tkowo�� pozwala wykorzysta� okresy bezczynno�ci pojawiaj�cesi� w dzia�aniu wi�kszo�ci programów. Wi�kszo�� urz�dze� wej�cia i wyj�cia takich jak portysieciowe, nap�dy dyskowe czy klawiatura dzia�a znacznie wolniej od procesora. Z tego powoduprogram cz�sto sp�dza wiele czasu na oczekiwaniu na moliwo�� wys�ania lub odebraniadanych za po�rednictwem urz�dzenia. Zastosowanie wielow�tkowo�ci pozwala programowiwykonywa� w tym czasie inne zadania. Na przyk�ad w czasie gdy jedna cz��� programu wysy�aplik w Internecie, inna moe zajmowa� si� odczytem klawiatury, a jeszcze inna buforowa�kolejny blok wysy�anych danych.

W ostatnich kilku latach mamy do czynienia z upowszechnieniem si� systemów wieloproce-sorowych i wielordzeniowych. Oczywi�cie nie wypar�y one zupe�nie systemów jednoproceso-rowych. Wielow�tkowo�� w Javie moe dzia�a� w obu typach systemów. W przypadku sys-temu jednordzeniowego wykonywane równolegle w�tki wspó�dziel� procesor i kady w�tekotrzymuje pewien przedzia� czasu procesora. Zatem w systemie jednordzeniowym dwa lubwi�cej w�tków nie jest w rzeczywisto�ci wykonywanych równocze�nie, ale ich zastosowaniepozwala wykorzysta� czas bezczynno�ci procesora. Natomiast w systemach wieloproceso-rowych b�d wielordzeniowych w�tki rzeczywi�cie mog� dzia�a� równolegle. W wielu przy-padkach pozwala to jeszcze bardziej poprawi� efektywno�� dzia�ania programu i zwi�kszy�szybko�� wykonywania niektórych operacji.

W�tek moe znajdowa� si� w jednym z kilku stanów. Moe by� wykonywany. Moe by�gotowy do wykonywania, gdy tylko otrzyma czas procesora. Wykonanie w�tku moe zosta�zawieszone, co oznacza, e w�tek nie jest wykonywany przez pewien czas. Jego wykonywaniemoe zosta� pó niej podj�te. W�tek moe zosta� zablokowany w oczekiwaniu na zwolnieniepewnego zasobu. I wreszcie wykonywanie w�tku moe zosta� zako�czone, co oznacza, enie mona ju go podj��.

Wielow�tkowo�� wi�e si� nierozerwalnie z poj�ciem synchronizacji, która umoliwia skoor-dynowane dzia�anie wielu w�tków. Java dysponuje kompletnym podsystemem synchronizacji.Jego podstawowe moliwo�ci równie omówi� w tym rozdziale.

Rozdzia� 11. � Programowanie wielow�tkowe 365

Je�li programowa�e� ju na przyk�ad w systemie Windows, to by� moe masz pewne poj�cieo wielow�tkowo�ci. Java umoliwia zarz�dzanie w�tkami za pomoc� odpowiednich elementówj�zyka, co czyni programowanie wielow�tkowe szczególnie wygodnym, poniewa wiele jegoszczegó�ów Java obs�uguje za Ciebie.

Klasa Thread i interfejs RunnableWielow�tkowo�� w Javie bazuje na klasie Thread i towarzysz�cym jej interfejsie Runnable,które umieszczono w pakiecie java.lang. Klasa Thread hermetyzuje w�tek. Je�li chcesz stwo-rzy� w programie nowy w�tek, powiniene� utworzy� obiekt klasy pochodnej klasy Threadalbo zaimplementowa� interfejs Runnable.

Klasa Thread definiuje szereg metod pomagaj�cych zarz�dza� w�tkami. Najcz��ciej uywanez tych metod przedstawi�em w tabeli 11.1 (przyjrzymy si� im bliej podczas ich uyciaw przyk�adach).

Tabela 11.1. Wybrane metody klasy Thread

Metoda Znaczenie

final String getName( ) Zwraca nazw� w�tku.final int getPriority( ) Zwraca priorytet w�tku.final boolean isAlive( ) Sprawdza, czy w�tek jest nadal wykonywany.final void join( ) Czeka na zako�czenie w�tku.void run( ) Punkt wej�cia w�tku.static void sleep(long milisekund) Zawiesza wykonywanie w�tku na podan� liczb� milisekund.void start( ) Rozpoczyna wykonywanie w�tku przez wywo�anie metody run( ).

Wszystkie procesy maj� przynajmniej jeden w�tek wykonania, zwykle nazywany w�tkiemg�ównym, poniewa jego wykonanie rozpoczyna si� w momencie uruchomienia programu.Moemy zatem powiedzie�, e we wszystkich dotychczasowych przyk�adach uywali�myw�tku g�ównego. W w�tku g�ównym moesz tworzy� kolejne w�tki programu.

Tworzenie w�tkuW�tek powstaje przez utworzenie obiektu typu Thread. Klasa Thread hermetyzuje obiekt, którymoe by� wykonywany. Jak ju wspomnia�em, Java umoliwia dwa sposoby tworzenia takichobiektów:

� poprzez implementacj� interfejsu Runnable,

� poprzez tworzenie klas pochodnych klasy Thread.

W wi�kszo�ci przyk�adów w tym rozdziale b�dziemy implementowa� interfejs Runnable.Natomiast w przyk�adzie 11.1 zademonstruj�, jak zaimplementowa� w�tek, tworz�c klas�

366 Java. Przewodnik dla pocz�tkuj�cych

pochodn� klasy Thread. Zapami�taj: oba podej�cia i tak uywaj� klasy Thread do tworzeniaw�tku i zarz�dzania nim. Jedyna rónica polega na sposobie, w jaki powstaje klasa reprezentu-j�ca w�tki.

Interfejs Runnable stanowi abstrakcj� wykonywalnego kodu. W�tek moesz utworzy� napodstawie kadego obiektu, który implementuje interfejs Runnable. Interfejs ten ma tylko jedn�metod� o nazwie run() zadeklarowan� w nast�puj�cy sposób:

public void run()

Wewn�trz metody run() umieszczasz kod wykonywany przez nowy w�tek. Podobnie jakg�ówny w�tek programu, tak i metoda run()moe wywo�ywa� inne metody, uywa� innychklas i deklarowa� zmienne. Jedyna rónica polega na tym, e metoda run() jest punktemwej�cia do osobnego, równolegle wykonywanego w�tku programu. Wykonywanie tego w�tkuko�czy si�, gdy metoda run() zwróci sterowanie.

Po utworzeniu klasy implementuj�cej interfejs Runnable na podstawie jej obiektu tworzyszobiekt typu Thread. Klasa Thread definiuje szereg konstruktorów. Na pocz�tek b�dziemyuywa� poniszego:

Thread(Runnable obW�tku)

W tym przypadku parametr obW�tku jest instancj� klasy implementuj�cej interfejs Runnable.Definiuje on punkt, w którym rozpocznie si� wykonywanie nowego w�tku.

Po utworzeniu nowy w�tek nie b�dzie wykonywany, dopóki nie wywo�asz jego metodystart() zadeklarowanej w klasie Thread. Dzia�anie metody start() sprowadza si� w zasadziedo wywo�ania metody run(). Poniej przedstawi�em deklaracj� metody start():

void start()

Na listingu 11.1 przedstawi�em przyk�ad programu, który tworzy nowy w�tek i rozpoczynajego wykonywanie.

Listing 11.1. UseThreads.java

// Tworzy w�tek, implementuj�c interfejs Runnable.

class MyThread implements Runnable { String thrdName;

MyThread(String name) { thrdName = name; }

// Punkt wej�ciowy w�tku. public void run() { Tutaj rozpoczyna si� wykonywanie w�tku.

System.out.println(thrdName + " rozpoczyna dzia�anie."); try { for(int count=0; count < 10; count++) { Thread.sleep(400); System.out.println(thrdName + " jest wykonywany, warto�� licznika: " + count); } }

Obiekty klasy MyThread mog� by�wykonywane we w�asnych w�tkach,poniewa� klasa MyThread implementujeinterfejs Runnable.

Rozdzia� 11. � Programowanie wielow�tkowe 367

catch(InterruptedException exc) { System.out.println(thrdName + " zosta� przerwany."); } System.out.println(thrdName + " koczy dzia�anie."); }}

class UseThreads { public static void main(String args[]) { System.out.println("G�ówny w�tek rozpoczyna dzia�anie.");

// Najpierw tworzy obiekt klasy MyThread. MyThread mt = new MyThread("W�tek potomny nr 1");

// Nast�pnie na jego podstawie tworzy w�tek. Thread newThrd = new Thread(mt); Tworzy w�tek dla tego obiektu.

// Na koniec rozpoczyna wykonywanie w�tku. newThrd.start(); Uruchamia w�tek.

for(int i=0; i<50; i++) { System.out.print("."); try { Thread.sleep(100); } catch(InterruptedException exc) { System.out.println("W�tek g�ówny zosta� przerwany."); } }

System.out.println("W�tek g�ówny koczy dzia�anie."); }}

Przyjrzyjmy si� bliej temu programowi. Najpierw klasa MyThread implementuje interfejsRunnable. Oznacza to, e obiekt typu MyThread moe zosta� przekazany konstruktorowi klasyi by� wykonywany we w�asnym w�tku.

Wewn�trz metody run() dzia�a p�tla for odliczaj�ca od 0 do 9. Zwró� uwag� na wywo�aniemetody sleep(). Metoda sleep() powoduje zawieszenie w�tku, w którym zosta�a wywo�ana,na czas wyraony w milisekundach. Jej deklaracj� przedstawi�em poniej:

static void sleep(long milisekund) throwws InterruptedException

Wykonywanie w�tku zostaje zawieszone na czas milisekund. Metoda sleep() moe wygene-rowa� wyj�tek InterruptedException i wobec tego musi by� wywo�ywana w bloku try.Metoda sleep() ma równie drug� wersj�, która umoliwia okre�lenie czasu zawieszeniaw�tku z dok�adno�ci� nie tylko co do milisekundy, ale równie nanosekundy, je�li potrzebu-jesz a takiej precyzji. W naszym przyk�adzie metoda sleep() wywo�ywana przez metod�run() zawiesza wykonywanie w�tku na 400 milisekund podczas kadego przebiegu p�tli.Dzi�ki temu spowolnieniu moemy obserwowa� wykonywanie w�tku.

Wewn�trz metody main() nowy obiekt typu Thread zostaje utworzony na skutek wykonaniaponiszej sekwencji instrukcji:

Tworzy obiektimplementuj�cyinterfejs Runnable.

368 Java. Przewodnik dla pocz�tkuj�cych

// Najpierw tworzy obiekt klasy MyThread.MyThread mt = new MyThread("W�tek potomny nr 1");

// Nast�pnie na jego podstawie tworzy w�tek.Thread newThrd = new Thread(mt);

// Na koniec rozpoczyna wykonywanie w�tku.newThrd.start();

Jak sugeruj� to komentarze, najpierw zostaje utworzony obiekt klasy MyThread. Obiekt tenzostaje nast�pnie uyty do stworzenia obiektu typu Thread. Jest to moliwe, poniewa klasaMyThread implementuje interfejs Runnable. Na koniec wykonywanie nowego w�tku rozpo-czyna si� dzi�ki wywo�aniu metody start(). Wywo�uje ona metod� run() nowego w�tku.Po wywo�aniu metody start() sterowanie powraca do metody main(), która rozpoczynawykonywanie w�asnej p�tli for. P�tla ta wykonywana jest 50 razy i w kadym przebiegu zawie-sza wykonanie g�ównego w�tku na 100 milisekund. Oba w�tki kontynuuj� swoje dzia�anie,wspó�dziel�c procesor (w systemie jednoprocesorowym). Trwa to a do momentu, w którymzako�czy si� dzia�anie wykonywanych przez nie p�tli. Komunikaty wy�wietlane przez obaw�tki przedstawi�em poniej. Ze wzgl�du na rónice w �rodowisku wykonania programuefekt jego dzia�ania w Twoim przypadku moe si� nieco róni�.

G�ówny w�tek rozpoczyna dzia�anie..W�tek potomny nr 1 rozpoczyna dzia�anie.....W�tek potomny nr 1 jest wykonywany, warto�� licznika: 0...W�tek potomny nr 1 jest wykonywany, warto�� licznika: 1....W�tek potomny nr 1 jest wykonywany, warto�� licznika: 2....W�tek potomny nr 1 jest wykonywany, warto�� licznika: 3....W�tek potomny nr 1 jest wykonywany, warto�� licznika: 4....W�tek potomny nr 1 jest wykonywany, warto�� licznika: 5....W�tek potomny nr 1 jest wykonywany, warto�� licznika: 6....W�tek potomny nr 1 jest wykonywany, warto�� licznika: 7....W�tek potomny nr 1 jest wykonywany, warto�� licznika: 8....W�tek potomny nr 1 jest wykonywany, warto�� licznika: 9W�tek potomny nr 1 koczy dzia�anie...........W�tek g�ówny koczy dzia�anie.

W przyk�adzie tym warto zwróci� uwag� na jeszcze jedn� rzecz. Aby zilustrowa� fakt rów-noczesnego wykonywania w�tku g�ównego i w�tku mt, musia�em unikn�� zako�czenia dzia-�ania metody main(), zanim w�tek mt zako�czy swoje dzia�anie. W tym celu wykorzysta�emrónice czasowe w dzia�aniu obu w�tków. Poniewa wywo�ania metody sleep() w p�tli formetody main() powoduj� ca�kowite opó nienie równe 5 sekund (50 iteracji po 100 sekundkada), a ca�kowite opó nienie wewn�trz p�tli for metody run() wynosi jedynie 4 sekundy(10 iteracji po 400 milisekund kada), metoda run() zako�czy dzia�anie sekund� wcze�niejni metoda main(). W efekcie w�tek g�ówny i w�tek mt s� wykonywane równolegle do momentuzako�czenia w�tku mt. Wykonywanie w�tku g�ównego (metody main()) ko�czy si� sekund�pó niej.

Chocia wykorzystanie rónic czasowych pozwoli�o mi zademonstrowa� równoleg�e dzia�a-nie w�tków, rozwi�zania takiego nie stosuje si� w praktyce. Java udost�pnia znacznie lepszesposoby oczekiwania na zako�czenie w�tku. Jeden z nich omówi� w dalszej cz��ci rozdzia�u.

I jeszcze jedno: w przypadku programów wielow�tkowych najcz��ciej b�dziemy chcieli, abyw�tek g�ówny ko�czy� swoje dzia�anie jako ostatni. W ogólnym przypadku program dzia�a,

Rozdzia� 11. � Programowanie wielow�tkowe 369

dopóki nie zako�czy si� wykonywanie wszystkich jego w�tków. Zatem nie jest wymagane,by w�tek g�ówny ko�czy� swoje dzia�anie jako ostatni. Ale cz�sto jest to przyk�adem dobrejpraktyki programistycznej, zw�aszcza gdy dopiero uczysz si� korzystania z w�tków.

Drobne usprawnienia

Chocia poprzedni program jest zupe�nie poprawny, niewielkie modyfikacje mog� usprawni�jego dzia�anie i u�atwi� jego uycie. Po pierwsze, moemy rozpocz�� wykonywanie w�tkunatychmiast po jego utworzeniu. W tym celu tworzymy obiekt Thread wewn�trz konstruktoraklasy MyThread. Po drugie, klasa MyThread nie musi przechowywa� nazwy w�tku, poniewamoemy nada� mu j� podczas tworzenia. W tym celu uyjemy nast�puj�cej wersji konstruktoraklasy Thread:

Thread(Runnable obW�tku, String nazwa)

W tym przypadku parametr nazwa okre�la oczywi�cie nazw� w�tku.

Ekspert odpowiada

Pytanie: Dlaczego zalecasz, aby g�ówny w�tek ko�czy� dzia�anie jako ostatni?

Odpowied: W starszych wersjach Javy zako�czenie dzia�ania g�ównego w�tku przed zako�czeniemdzia�ania w�tku potomnego mog�o powodowa� b��d dzia�ania maszyny wirtualnej. Nowoczesne wersjeJavy nie stwarzaj� ju� tego rodzaju problemów. Lepiej jednak zachowa� ostro�no��, poniewa� nigdynie wiemy, w jakim �rodowisku przyjdzie dzia�a� naszemu programowi. Dodatkowo w�tek g�ównyjest doskona�ym miejscem do wykonania operacji zwi�zanych z zako�czeniem dzia�ania programu,na przyk�ad zamkni�cia plików. Z tego powodu cz�sto rzeczywi�cie ma sens, aby ko�czy� on swojedzia�anie jako ostatni. Na szcz��cie bardzo �atwo mo�emy zaprogramowa� oczekiwanie w�tku g�ów-nego na zako�czenie dzia�ania wszystkich jego w�tków potomnych.

Nazw� w�tku moemy uzyska�, wywo�uj�c metod� getName() zdefiniowan� w klasie Thread.Jej ogóln� posta� przedstawi�em poniej:

final String getName()

Chocia nie jest to konieczne, w naszym nast�pnym programie moesz nada� nazw� w�tkowipo jego utworzeniu. W tym celu uyjesz metody setName() przedstawionej poniej:

final void setName(String nazwaW�tku)

Ulepszon� wersj� poprzedniego programu przedstawi�em na listingu 11.2.

Listing 11.2. UseThreadsImproved.java

// Ulepszona wersja klasy MyThread.

class MyThread implements Runnable { Thread thrd; Zmienna thrd przechowuje referencj� w�tku.

// Tworzy nowy w�tek. MyThread(String name) { thrd = new Thread(this, name); W�tek otrzymuje nazw� w momencie utworzenia.

thrd.start(); // uruchamia nowy w�tek Uruchamia w�tek.

370 Java. Przewodnik dla pocz�tkuj�cych

}

// Rozpoczyna wykonywanie nowego w�tku. public void run() { System.out.println(thrd.getName() + " rozpoczyna dzia�anie."); try { for(int count=0; count<10; count++) { Thread.sleep(400); System.out.println(thrd.getName() + " jest wykonywany, warto�� licznika: " + count); } } catch(InterruptedException exc) { System.out.println(thrd.getName() + " zosta� przerwany."); } System.out.println(thrd.getName() + " koczy dzia�anie."); }}

class UseThreadsImproved { public static void main(String args[]) { System.out.println("G�ówny w�tek rozpoczyna dzia�anie.");

MyThread mt = new MyThread("W�tek potomny nr 1");

for(int i=0; i < 50; i++) { Teraz w�tek zostaje uruchomiony w momencie utworzenia.

System.out.print("."); try { Thread.sleep(100); } catch(InterruptedException exc) { System.out.println("W�tek g�ówny zosta� przerwany."); } }

System.out.println("W�tek g�ówny koczy dzia�anie."); }}

Ta wersja programu wy�wietla takie same komunikaty jak poprzednia. Zwró� uwag�, e refe-rencj� w�tku przechowuje sk�adowa thrd klasy MyThread.

Przyk�ad 11.1. Tworzymy klas� pochodn� klasy Thread

Implementacja interfejsu Runnable jest jednym ze sposobów tworzenia klasyreprezentuj�cej w�tki. Drugi sposób polega na utworzeniu klasy w�tków jako

klasy pochodnej klasy Thread. W tym przyk�adzie utworzymy w�a�nie klas� pochodn� klasyThread i wykorzystamy j� w programie, którego funkcjonalno�� b�dzie odpowiada� progra-mowi UseThreadsImproved.

Tworz�c klas� pochodn� klasy Thread, musimy przes�oni� jej metod� run() stanowi�c� punktwej�cia do nowego w�tku. Nowa klasa musi równie wywo�a� metod� start(), aby rozpo-cz�� wykonywanie nowego w�tku. Moesz równie przes�oni� inne metody klasy Thread(), alenie jest to wymagane.

ExtendThread.java

Rozdzia� 11. � Programowanie wielow�tkowe 371

1. Utwórz plik o nazwie ExtendThread.java. Skopiuj do niego kod ród�owy z plikuUseThreadsImproved.java.

2. Zmie� deklaracj� klasy Thread tak, aby zamiast implementowa� interfejs Runnable,dziedziczy�a po klasie Thread:

class MyThread extends Thread {

3. Usu� poniszy wiersz:Thread thrd;

Zmienna sk�adowa thrd nie jest ju potrzebna, poniewa instancja klasy MyThreadzawiera instancj� klasy Thread, do której moe si� odwo�ywa�.

4. Zmie� konstruktor klasy MyThread w nast�puj�cy sposób:// Tworzy nowy w�tek.MyThread(String name) { super(name); // nazwa w�tku start(); // uruchamia w�tek}

Wywo�anie super zostaje uyte w celu uruchomienia nast�puj�cego konstruktoraklasy Thread:

Thread(String nazwa)

gdzie parametr nazwa okre�la oczywi�cie nazw� tworzonego w�tku.

5. Zmie� metod� run() tak, aby bezpo�rednio, czyli bez uycia zmiennej thrd, wywo�ywa�ametod� getName():

// Rozpoczyna wykonywanie nowego w�tku. public void run() { System.out.println(getName() + " rozpoczyna dzia�anie."); try { for(int count=0; count < 10; count++) { Thread.sleep(400); System.out.println(getName() + " jest wykonywany, warto�� licznika: " + count); } } catch(InterruptedException exc) { System.out.println(getName() + " zosta� przerwany."); }

System.out.println(getName() + " zosta� przerwany."); }

6. Na listingu 11.3 przedstawi�em kompletny tekst ród�owy programu, który w obecnejwersji tworzy klas� pochodn� klasy Thread, zamiast implementowa� interfejs Runnable.Wynik dzia�ania wy�wietlany przez program b�dzie taki sam jak w przypadkupoprzednich wersji programu.

Listing 11.3. ExtendThread.java

/* Przyk�ad 11.1

Tworzy klas� pochodn� klasy Thread.

372 Java. Przewodnik dla pocz�tkuj�cych

*/class MyThread extends Thread {

// Tworzy nowy w�tek. MyThread(String name) { super(name); // nazwa w�tku start(); // uruchamia w�tek }

// Rozpoczyna wykonywanie nowego w�tku. public void run() { System.out.println(getName() + " rozpoczyna dzia�anie."); try { for(int count=0; count < 10; count++) { Thread.sleep(400); System.out.println(getName() + " jest wykonywany, warto�� licznika: " + count); } } catch(InterruptedException exc) { System.out.println(getName() + " zosta� przerwany."); }

System.out.println(getName() + " zosta� przerwany."); }}

class ExtendThread { public static void main(String args[]) { System.out.println("G�ówny w�tek rozpoczyna dzia�anie.");

MyThread mt = new MyThread("W�tek potomny nr 1");

for(int i=0; i < 50; i++) { System.out.print("."); try { Thread.sleep(100); } catch(InterruptedException exc) { System.out.println("W�tek g�ówny zosta� przerwany."); } }

System.out.println("W�tek g�ówny koczy dzia�anie."); }}

Tworzenie wielu w�tkówW poprzednich przyk�adach tworzyli�my tylko jeden w�tek potomny. Nic nie stoi jednak naprzeszkodzie, aby Twój program tworzy� dowoln�, potrzebn� liczb� w�tków. Program przed-stawiony na listingu 11.4 tworzy trzy w�tki potomne.

Rozdzia� 11. � Programowanie wielow�tkowe 373

Listing 11.4. MoreThreads.java

// Tworzy wiele w�tków.

class MyThread implements Runnable { Thread thrd;

// Tworzy nowy w�tek. MyThread(String name) { thrd = new Thread(this, name);

thrd.start(); // uruchamia w�tek }

// Rozpoczyna wykonywanie nowego w�tku. public void run() { System.out.println(thrd.getName() + " rozpoczyna dzia�anie."); try { for(int count=0; count < 10; count++) { Thread.sleep(400); System.out.println(thrd.getName() + " jest wykonywany, warto�� licznika: " + count); } } catch(InterruptedException exc) { System.out.println(thrd.getName() + " zosta� przerwany."); } System.out.println(thrd.getName() + " koczy dzia�anie."); }}

class MoreThreads { public static void main(String args[]) { System.out.println("G�ówny w�tek rozpoczyna dzia�anie.");

MyThread mt1 = new MyThread("W�tek potomny nr 1"); MyThread mt2 = new MyThread("W�tek potomny nr 2"); MyThread mt3 = new MyThread("W�tek potomny nr 3");

for(int i=0; i < 50; i++) { System.out.print("."); try { Thread.sleep(100); } catch(InterruptedException exc) { System.out.println("W�tek g�ówny zosta� przerwany."); } }

System.out.println("W�tek g�ówny koczy dzia�anie."); }}

A oto przyk�ad dzia�ania tego programu:G�ówny w�tek rozpoczyna dzia�anie.W�tek potomny nr 1 rozpoczyna dzia�anie.

Tworzy i uruchamiatrzy w�tki.

374 Java. Przewodnik dla pocz�tkuj�cych

W�tek potomny nr 3 rozpoczyna dzia�anie..W�tek potomny nr 2 rozpoczyna dzia�anie....W�tek potomny nr 1 jest wykonywany, warto�� licznika: 0W�tek potomny nr 3 jest wykonywany, warto�� licznika: 0.W�tek potomny nr 2 jest wykonywany, warto�� licznika: 0...W�tek potomny nr 1 jest wykonywany, warto�� licznika: 1W�tek potomny nr 3 jest wykonywany, warto�� licznika: 1.W�tek potomny nr 2 jest wykonywany, warto�� licznika: 1...W�tek potomny nr 1 jest wykonywany, warto�� licznika: 2W�tek potomny nr 3 jest wykonywany, warto�� licznika: 2.W�tek potomny nr 2 jest wykonywany, warto�� licznika: 2....W�tek potomny nr 3 jest wykonywany, warto�� licznika: 3W�tek potomny nr 1 jest wykonywany, warto�� licznika: 3W�tek potomny nr 2 jest wykonywany, warto�� licznika: 3....W�tek potomny nr 3 jest wykonywany, warto�� licznika: 4W�tek potomny nr 1 jest wykonywany, warto�� licznika: 4W�tek potomny nr 2 jest wykonywany, warto�� licznika: 4....W�tek potomny nr 3 jest wykonywany, warto�� licznika: 5W�tek potomny nr 1 jest wykonywany, warto�� licznika: 5W�tek potomny nr 2 jest wykonywany, warto�� licznika: 5...W�tek potomny nr 3 jest wykonywany, warto�� licznika: 6W�tek potomny nr 1 jest wykonywany, warto�� licznika: 6.W�tek potomny nr 2 jest wykonywany, warto�� licznika: 6...W�tek potomny nr 3 jest wykonywany, warto�� licznika: 7W�tek potomny nr 1 jest wykonywany, warto�� licznika: 7.W�tek potomny nr 2 jest wykonywany, warto�� licznika: 7...W�tek potomny nr 1 jest wykonywany, warto�� licznika: 8.W�tek potomny nr 3 jest wykonywany, warto�� licznika: 8W�tek potomny nr 2 jest wykonywany, warto�� licznika: 8...W�tek potomny nr 1 jest wykonywany, warto�� licznika: 9W�tek potomny nr 1 koczy dzia�anie..W�tek potomny nr 3 jest wykonywany, warto�� licznika: 9W�tek potomny nr 3 koczy dzia�anie.W�tek potomny nr 2 jest wykonywany, warto�� licznika: 9W�tek potomny nr 2 koczy dzia�anie..........W�tek g�ówny koczy dzia�anie.

Ekspert odpowiada

Pytanie: Dlaczego Java udost�pnia dwa sposoby tworzenia w�tków potomnych (przez tworzenie klaspochodnych klasy Thread lub przez implementacj� interfejsu Runnable) i który z nich jest lepszy?

Odpowied: Klasa Thread definiuje szereg metod, które mog� zosta� przes�oni�te w klasie pochod-nej. Natomiast wymagane jest przes�oni�cie tylko jednej z nich: run(). Ta sama metoda jest oczy-wi�cie wymagana podczas implementacji interfejsu Runnable. Cz��� programistów Javy uwa�a, �eklasy pochodne nale�y tworzy� tylko wtedy, gdy stanowi� one specjalizacj� klasy bazowej. Je�li zatemnie zamierzasz przes�ania� �adnej innej metody klasy Thread, to najlepiej implementuj interfejsRunnable. Implementacja interfejsu klasy Runnable umo�liwi Twojej klasie w�tku równie� dziedzicze-nie po innej klasie ni� klasa Thread.

Jak widzisz, po uruchomieniu wszystkie trzy w�tki potomne wspó�dziel� czas procesora. Zwró�uwag�, e w�tki s� uruchamiane w kolejno�ci ich utworzenia. Nie jest to regu��, Java moe usze-regowa� dzia�anie w�tków w dowolny sposób. Ze wzgl�du na rónice w �rodowisku wyko-nywania informacje wy�wietlane przez program mog� si� nieco róni� w Twoim przypadku.

Rozdzia� 11. � Programowanie wielow�tkowe 375

Jak ustali, kiedy w�tekzakoczy� dzia�anie?

Cz�sto w programie chcieliby�my sprawdzi�, czy w�tek zako�czy� swoje dzia�anie. Na przy-k�ad w poprzednich przyk�adach w celach demonstracyjnych nie chcia�em ko�czy� dzia�aniag�ównego w�tku, zanim nie zako�czy�y si� w�tki potomne. W tym celu zawiesza�em dzia�a-nie w�tku g�ównego na d�uej ni w�tków potomnych. Jednak w ogólnym przypadku trudnouzna� takie rozwi�zanie za satysfakcjonuj�ce.

Na szcz��cie klasa Thread dostarcza dwóch sposobów pozwalaj�cych ustali�, czy w�tek zako�-czy� dzia�anie. Pierwszy z nich polega na wywo�aniu metody isAlive() dla sprawdzanegow�tku. Ogóln� posta� tej metody przedstawi�em poniej:

final boolean isAlive()

Metoda isAlive() zwraca warto�� true, je�li wyj�tek, dla którego zosta�a wywo�ana, nadaldzia�a. W przeciwnym razie zwraca warto�� false. Aby wypróbowa� jej dzia�anie, zast�pw poprzednim przyk�adzie klas� MoreThreads jej wersj� przedstawion� na listingu 11.5.

Listing 11.5. MoreThreads2.java

// U�ywa isAlive().class MoreThreads2 { public static void main(String args[]) { System.out.println("G�ówny w�tek rozpoczyna dzia�anie.");

MyThread mt1 = new MyThread("W�tek potomny nr 1"); MyThread mt2 = new MyThread("W�tek potomny nr 2"); MyThread mt3 = new MyThread("W�tek potomny nr 3");

do { System.out.print("."); try { Thread.sleep(100); } catch(InterruptedException exc) { System.out.println("W�tek g�ówny zosta� przerwany."); } } while (mt1.thrd.isAlive() || mt2.thrd.isAlive() || Oczekuje na zako�czenie wszystkich w�tków.

mt3.thrd.isAlive());

System.out.println("W�tek g�ówny koczy dzia�anie."); }}

Ta wersja programu wy�wietla podobne informacje jak poprzednia, z t� rónic�, e metodamain() ko�czy swoje dzia�anie, jak tylko zako�cz� je pozosta�e w�tki. Rónica ta wynikaz zastosowania metody isAlive() podczas oczekiwania na zako�czenie w�tków potomnych.Drugi sposób oczekiwania na zako�czenie w�tku polega na wywo�aniu metody join() przed-stawionej poniej:

376 Java. Przewodnik dla pocz�tkuj�cych

final void join( ) throws InterruptedException

Metoda ta czeka, a w�tek, dla którego zosta�a wywo�ana, zako�czy dzia�anie. Nazwa metodysugeruje, e w�tek, który j� wywo�a�, czeka, a okre�lony w�tek si� z nim po��czy (ang. join).Inne wersje metody join() pozwalaj� okre�li� maksymalny czas oczekiwania na zako�cze-nie w�tku.

Na listingu 11.6 przedstawi�em program, który uywa metody join(), aby zagwarantowa�,e g�ówny w�tek zako�czy swoje dzia�anie jako ostatni.

Listing 11.6. JoinThreads.java

// U�ywa join().

class MyThread implements Runnable { Thread thrd;

// Tworzy nowy w�tek. MyThread(String name) { thrd = new Thread(this, name); thrd.start(); // uruchamia nowy w�tek }

// Rozpoczyna wykonywanie nowego w�tku. public void run() { System.out.println(thrd.getName() + " rozpoczyna dzia�anie."); try { for(int count=0; count < 10; count++) { Thread.sleep(400); System.out.println(thrd.getName() + " jest wykonywany, warto�� licznika: " + count); } } catch(InterruptedException exc) { System.out.println(thrd.getName() + " zosta� przerwany."); } System.out.println(thrd.getName() + " koczy dzia�anie."); }}

class JoinThreads { public static void main(String args[]) { System.out.println("G�ówny w�tek rozpoczyna dzia�anie.");

MyThread mt1 = new MyThread("W�tek potomny nr 1"); MyThread mt2 = new MyThread("W�tek potomny nr 2"); MyThread mt3 = new MyThread("W�tek potomny nr 3");

try { mt1.thrd.join(); System.out.println("W�tek potomny nr 1 zakoczy� dzia�anie."); mt2.thrd.join(); System.out.println("W�tek potomny nr 2 zakoczy� dzia�anie."); mt3.thrd.join(); System.out.println("W�tek potomny nr 3 zakoczy� dzia�anie."); }

Oczekuj� na zako�czeniekonkretnego w�tku.

Rozdzia� 11. � Programowanie wielow�tkowe 377

catch(InterruptedException exc) { System.out.println("W�tek g�ówny zosta� przerwany."); } System.out.println("W�tek g�ówny koczy dzia�anie."); }}

Poniej przedstawi�em wynik dzia�ania tego programu. Pami�taj, e gdy uruchomisz programw swoim �rodowisku, wynik moe by� nieco inny.

G�ówny w�tek rozpoczyna dzia�anie.W�tek potomny nr 1 rozpoczyna dzia�anie.W�tek potomny nr 3 rozpoczyna dzia�anie.W�tek potomny nr 2 rozpoczyna dzia�anie.W�tek potomny nr 1 jest wykonywany, warto�� licznika: 0W�tek potomny nr 2 jest wykonywany, warto�� licznika: 0W�tek potomny nr 3 jest wykonywany, warto�� licznika: 0W�tek potomny nr 1 jest wykonywany, warto�� licznika: 1W�tek potomny nr 2 jest wykonywany, warto�� licznika: 1W�tek potomny nr 3 jest wykonywany, warto�� licznika: 1W�tek potomny nr 1 jest wykonywany, warto�� licznika: 2W�tek potomny nr 2 jest wykonywany, warto�� licznika: 2W�tek potomny nr 3 jest wykonywany, warto�� licznika: 2W�tek potomny nr 2 jest wykonywany, warto�� licznika: 3W�tek potomny nr 1 jest wykonywany, warto�� licznika: 3W�tek potomny nr 3 jest wykonywany, warto�� licznika: 3W�tek potomny nr 1 jest wykonywany, warto�� licznika: 4W�tek potomny nr 2 jest wykonywany, warto�� licznika: 4W�tek potomny nr 3 jest wykonywany, warto�� licznika: 4W�tek potomny nr 2 jest wykonywany, warto�� licznika: 5W�tek potomny nr 1 jest wykonywany, warto�� licznika: 5W�tek potomny nr 3 jest wykonywany, warto�� licznika: 5W�tek potomny nr 1 jest wykonywany, warto�� licznika: 6W�tek potomny nr 2 jest wykonywany, warto�� licznika: 6W�tek potomny nr 3 jest wykonywany, warto�� licznika: 6W�tek potomny nr 1 jest wykonywany, warto�� licznika: 7W�tek potomny nr 2 jest wykonywany, warto�� licznika: 7W�tek potomny nr 3 jest wykonywany, warto�� licznika: 7W�tek potomny nr 2 jest wykonywany, warto�� licznika: 8W�tek potomny nr 1 jest wykonywany, warto�� licznika: 8W�tek potomny nr 3 jest wykonywany, warto�� licznika: 8W�tek potomny nr 2 jest wykonywany, warto�� licznika: 9W�tek potomny nr 1 jest wykonywany, warto�� licznika: 9W�tek potomny nr 2 koczy dzia�anie.W�tek potomny nr 1 koczy dzia�anie.W�tek potomny nr 1 zakoczy� dzia�anie.W�tek potomny nr 2 zakoczy� dzia�anie.W�tek potomny nr 3 jest wykonywany, warto�� licznika: 9W�tek potomny nr 3 koczy dzia�anie.W�tek potomny nr 3 zakoczy� dzia�anie.W�tek g�ówny koczy dzia�anie.

Jak �atwo zauway�, powrót sterowania z metody join() oznacza zako�czenie w�tku.

378 Java. Przewodnik dla pocz�tkuj�cych

Priorytety w�tkówZ kadym w�tkiem zwi�zany jest priorytet. Priorytet w�tku decyduje, przynajmniej cz��ciowo,o tym, ile czasu procesora otrzyma dany w�tek w porównaniu do innych w�tków. W ogólnymprzypadku spodziewamy si�, e w�tek o niskim priorytecie otrzyma ma�o czasu procesora,a w�tek o wysokim priorytecie znacznie wi�cej. Ilo�� czasu procesora przydzielonego w�tkowima istotny wp�yw na charakterystyk� wykonania w�tku i jego interakcj� z innymi w�tkamiwykonywanymi równolegle w systemie.

Na ilo�� czasu procesora przydzielan� w�tkowi maj� wp�yw oprócz priorytetu w�tku takeinne czynniki. Na przyk�ad: je�li w�tek o wysokim priorytecie oczekuje na pewien zasób, naprzyk�ad na wprowadzenie danych z klawiatury, to w tym czasie wykonywane b�d� w�tki o ni-szym priorytecie. Jednak gdy w�tek o wysokim priorytecie uzyska dost�p do zasobu, to w�tkio niszym priorytecie zostan� wyw�aszczone z procesora i wznowione zostanie wykonywa-nie w�tku o wysokim priorytecie. Innym czynnikiem wp�ywaj�cym na szeregowanie w�tkówjest sposób implementacji wielozadaniowo�ci w danym systemie (patrz ramka „Ekspert odpo-wiada” na ko�cu tego podrozdzia�u). Dlatego te nawet je�li nadasz róne priorytety w�tkomprogramu, nie musi to oznacza�, e jeden z w�tków b�dzie wykonywany szybciej lub cz��ciejni inny w�tek. W�tek o wysokim priorytecie ma jedynie potencjalnie lepszy dost�p do pro-cesora.

W�tek potomny ma po uruchomieniu taki sam priorytet jak w�tek g�ówny. Priorytet w�tkumoesz zmieni� za pomoc� metody setPriority() zdefiniowanej w klasie Thread. Poniejprzedstawi�em jej ogóln� posta�.

final void setPriority(int priorytet)

W tym przypadku parametr priorytet okre�la now� warto�� priorytetu dla w�tku, dla któregowywo�ano metod�. Warto�� parametru priorytet musi nalee� do przedzia�u od MIN_PRIORITYdo MAX_PRIORITY. Obecnie sta�e te maj� warto�ci odpowiednio 1 i 10. Aby przywróci� w�t-kowi zwyk�y priorytet, podajesz warto�� NORM_PRIORITY, obecnie równ� 5. Wymienione warto�cipriorytetów zosta�y zadeklarowane jako static final w klasie Thread.

Bie�cy priorytet w�tku moesz uzyska�, wywo�uj�c metod� getPriority() zdefiniowan�w klasie Thread, któr� przedstawiam poniej:

final int getPriority( )

Przyk�ad programu zamieszczony na listingu 11.7 demonstruje uycie dwóch w�tków o rónychpriorytetach. W�tki te tworzone s� jako instancje klasy Priority. Metoda run() tej klasy zawierap�tl� zliczaj�c� iteracje. P�tla ko�czy dzia�anie, gdy wykona 10 000 000 iteracji lub gdyzmienna stop zadeklarowana jako static ma warto�� true. Pocz�tkowo zmienna ta mawarto�� false, a warto�� true nadaje jej ten w�tek, który pierwszy zako�czy swoje dzia�anie.W ten sposób drugi z w�tków równie ko�czy swoje dzia�anie, gdy tylko otrzyma czas proce-sora. W kadym przebiegu p�tli �a�cuch currentName jest porównywany z nazw� wykony-wanego w�tku. Je�li s� róne, oznacza to, e nast�pi�o prze��czenie w�tków. Wtedy wy�wie-tlona zostaje nazwa nowego w�tku, która zostaje równie przypisana zmiennej currentName.Wy�wietlanie informacji na skutek prze��czenia w�tku umoliwia uytkownikowi obserwacj�dost�pu obu w�tków do procesora. Po zako�czeniu dzia�ania obu w�tków program wy�wietlaliczb� iteracji obu p�tli.

Rozdzia� 11. � Programowanie wielow�tkowe 379

Listing 11.7. PriorityDemo.java

// Demonstruje priorytety w�tków.

class Priority implements Runnable { int count; Thread thrd;

static boolean stop = false; static String currentName;

/* Tworzy nowy w�tek. Zwró� uwag�, �e ten konstruktor nie uruchamia w�tków. */ Priority(String name) { thrd = new Thread(this, name); count = 0; currentName = name; }

// Rozpoczyna wykonywanie nowego w�tku. public void run() { System.out.println(thrd.getName() + " rozpoczyna dzia�anie."); do { count++;

if(currentName.compareTo(thrd.getName()) != 0) { currentName = thrd.getName(); System.out.println(currentName + " jest wykonywany."); }

} while(stop == false && count < 10000000); stop = true;

System.out.println("\n" + thrd.getName() + " koczy dzia�anie."); }}

class PriorityDemo { public static void main(String args[]) { Priority mt1 = new Priority("W�tek o wysokim priorytecie"); Priority mt2 = new Priority("W�tek o niskim priorytecie");

// okre�la priorytet w�tków mt1.thrd.setPriority(Thread.NORM_PRIORITY+2); W�tek mt1 otrzymuje

mt2.thrd.setPriority(Thread.NORM_PRIORITY-2); wy�szy priorytet ni� w�tek mt2.

// uruchamia w�tki mt1.thrd.start(); mt2.thrd.start();

try { mt1.thrd.join(); mt2.thrd.join(); } catch(InterruptedException exc) { System.out.println("G�ówny w�tek rozpoczyna dzia�anie."); }

W�tek, który pierwszyosi�gnie 10 000 000,zatrzymuje wszystkie w�tki.

380 Java. Przewodnik dla pocz�tkuj�cych

System.out.println("\nW�tek o wysokim priorytecie odliczy� do " + mt1.count); System.out.println("W�tek o niskim priorytecie odliczy� do " + mt2.count); }}

A oto przyk�ad dzia�ania programu:W�tek o wysokim priorytecie rozpoczyna dzia�anie.W�tek o wysokim priorytecie jest wykonywany.W�tek o niskim priorytecie rozpoczyna dzia�anie.W�tek o niskim priorytecie jest wykonywany.W�tek o wysokim priorytecie jest wykonywany.

W�tek o niskim priorytecie koczy dzia�anie.

W�tek o wysokim priorytecie koczy dzia�anie.

W�tek o wysokim priorytecie odliczy� do 10000000W�tek o niskim priorytecie odliczy� do 8183

W tym przypadku w�tek o wysokim priorytecie zaw�aszczy� wi�kszo�� czasu procesora.Oczywi�cie dok�adny wynik dzia�ania programu zaley od liczby procesorów w systemie, ichszybko�ci, systemu operacyjnego i liczby innych zada� wykonywanych równocze�nie przezsystem.

Ekspert odpowiada

Pytanie: Czy sposób implementacji wielozadaniowo�ci w konkretnym systemie operacyjnym mawp�yw na to, ile czasu procesora otrzymuje w�tek?

Odpowied: Oprócz priorytetu w�tku najwi�kszy wp�yw na wykonanie w�tku ma w�a�nie sposób imple-mentacji wielozadaniowo�ci i szeregowania zada� w systemie operacyjnym. Niektóre systemy sto-suj� wielozadaniowo�� z wyw�aszczaniem, co gwarantuje, �e ka�dy w�tek otrzymuje czas procesora,przynajmniej okazjonalnie. W systemach, które nie u�ywaj� wyw�aszczania, wykonywany w�tek musisam zwolni� procesor, zanim b�dzie mo�liwe wykonywanie innego w�tku. W takich systemach �atwoo sytuacj�, w której jeden w�tek zaw�aszczy procesor, uniemo�liwiaj�c wykonywanie innych w�tków.

SynchronizacjaGdy uywasz w programie wielu w�tków, moe pojawi� si� konieczno�� skoordynowaniadzia�ania niektórych z nich. Proces, który to umoliwia, nazywamy synchronizacj�. Najcz�st-szym powodem synchronizacji jest sytuacja, gdy dwa lub wi�cej w�tków wymaga dost�pudo wspó�dzielonego zasobu, który moe by� uywany w danej chwili tylko przez jeden w�tek.Na przyk�ad gdy jeden w�tek zapisuje dane w pliku, inny w�tek nie moe wykonywa� zapisuw tym samym pliku w tym samym czasie. Innym powodem stosowania synchronizacji jestoczekiwanie w�tku na zdarzenie, którego przyczyn� jest inny w�tek. W tym przypadku musiistnie� sposób zawieszenia wykonywania w�tku do momentu, w którym nast�pi wspomnianezdarzenie. Wtedy w�tek musi wznowi� wykonywanie.

Rozdzia� 11. � Programowanie wielow�tkowe 381

Kluczem do synchronizacji w�tków w Javie jest koncepcja monitora. Monitor kontrolujedost�p do obiektu, uywaj�c blokad. Gdy dost�p do obiektu zostanie zablokowany przez jedenw�tek, obiekt nie jest dost�pny dla innych w�tków. Dopiero gdy w�tek przestanie uywa�obiektu, blokada zostaje zwolniona i obiekt jest dost�pny dla innych w�tków.

Z kadym obiektem Javy zwi�zany jest monitor. Monitory zosta�y wbudowane w j�zyk Javai dzi�ki temu Java umoliwia synchronizacj� dost�pu do wszystkich obiektów. Odbywa si�ona przez zastosowanie s�owa kluczowego synchronized i kilku metod, którymi dysponuj�wszystkie obiekty. Poniewa Jav� od pocz�tku projektowano z my�l� o synchronizacji, pos�u-giwanie si� tym mechanizmem jest duo �atwiejsze, ni mog�oby si� wydawa�. W wielu pro-gramach synchronizacja dost�pu do obiektów odbywa si� prawie w transparentny sposób.

Istniej� dwa sposoby zastosowania synchronizacji w Twoim kodzie. Oba wymagaj� uycias�owa kluczowego synchronized i oba zostan� omówione w tym rozdziale.

Synchronizacja metodSynchronizacj� dost�pu do metody moesz zapewni�, uywaj�c w jej deklaracji s�owa klu-czowego synchronized. Wywo�anie takiej metody powoduje, e monitor blokuje dost�p doobiektu. Gdy obiekt jest zablokowany, aden inny w�tek nie moe wywo�a� tej metody aniadnej innej metody tego obiektu zadeklarowanej w jego klasie jako synchronized. Gdy dzia-�anie metody ko�czy si�, monitor odblokowuje obiekt, umoliwiaj�c tym samym jego uycieprzez kolejny w�tek. W ten sposób synchronizacja dost�pu do obiektu odbywa si� praktyczniebez jakiegokolwiek dodatkowego wysi�ku ze strony programisty.

Program przedstawiony na listingu 11.8 demonstruje dzia�anie mechanizmu synchronizacji naprzyk�adzie metody sumArray() sumuj�cej elementy tablicy zawieraj�cej liczby ca�kowite.

Listing 11.8. Sync.java

// Synchronizacja dost�pu do metody.

class SumArray { private int sum;

synchronized int sumArray(int nums[]) { Dost�p do metody sumArray() sum = 0; // zeruje sum� jest synchronizowany.

for(int i=0; i<nums.length; i++) { sum += nums[i]; System.out.println(Thread.currentThread().getName() + " wyliczy� sum� cz��ciow� równ� " + sum); try { Thread.sleep(10); // umo�liwia prze��czenie w�tków } catch(InterruptedException exc) { System.out.println("W�tek zosta� przerwany."); } } return sum;

382 Java. Przewodnik dla pocz�tkuj�cych

}}

class MyThread implements Runnable { Thread thrd; static SumArray sa = new SumArray(); int a[]; int answer;

// Tworzy nowy w�tek. MyThread(String name, int nums[]) { thrd = new Thread(this, name); a = nums; thrd.start(); // uruchamia w�tek }

// Rozpoczyna wykonywanie nowego w�tku. public void run() { int sum;

System.out.println(thrd.getName() + " rozpoczyna dzia�anie.");

answer = sa.sumArray(a); System.out.println(thrd.getName() + " wyliczy� sum� równ� " + answer);

System.out.println(thrd.getName() + " koczy dzia�anie."); }}

class Sync { public static void main(String args[]) { int a[] = {1, 2, 3, 4, 5};

MyThread mt1 = new MyThread("W�tek potomny nr 1", a); MyThread mt2 = new MyThread("W�tek potomny nr 2", a);

try { mt1.thrd.join(); mt2.thrd.join(); } catch(InterruptedException exc) { System.out.println("W�tek g�ówny zosta� przerwany."); }

}}

A oto przyk�ad dzia�ania tego programu (kolejno�� komunikatów moe by� w Twoim przy-padku nieco inna).

W�tek potomny nr 1 rozpoczyna dzia�anie.W�tek potomny nr 2 rozpoczyna dzia�anie.W�tek potomny nr 1 wyliczy� sum� cz��ciow� równ� 1W�tek potomny nr 1 wyliczy� sum� cz��ciow� równ� 3W�tek potomny nr 1 wyliczy� sum� cz��ciow� równ� 6W�tek potomny nr 1 wyliczy� sum� cz��ciow� równ� 10

Rozdzia� 11. � Programowanie wielow�tkowe 383

W�tek potomny nr 1 wyliczy� sum� cz��ciow� równ� 15W�tek potomny nr 2 wyliczy� sum� cz��ciow� równ� 1W�tek potomny nr 1 wyliczy� sum� równ� 15W�tek potomny nr 1 koczy dzia�anie.W�tek potomny nr 2 wyliczy� sum� cz��ciow� równ� 3W�tek potomny nr 2 wyliczy� sum� cz��ciow� równ� 6W�tek potomny nr 2 wyliczy� sum� cz��ciow� równ� 10W�tek potomny nr 2 wyliczy� sum� cz��ciow� równ� 15W�tek potomny nr 2 wyliczy� sum� równ� 15W�tek potomny nr 2 koczy dzia�anie.

Przeanalizujmy szczegó�owo dzia�anie tego programu. Tworzy on trzy klasy. Pierwsz� z nichjest SumArray. Zawiera ona metod� sumArray(), która oblicza sum� elementów tablicy przecho-wuj�cej warto�ci ca�kowite. Druga klasa, MyThread, uywa obiektu typu SumArray. Referencj�sa tego obiektu zadeklarowa�em jako static i wobec tego istnieje tylko jedna jej kopiawspó�dzielona przez wszystkie obiekty klasy MyThread. Ostatnia z klas, Sync, tworzy dwaw�tki obliczaj�ce sum� zawarto�ci tej samej tablicy.

Metoda sumArray() wywo�uje metod� sleep(), aby umoliwi� prze��czenie w�tków. Jednakprze��czenie nie jest moliwe, gdy metoda sumArray() zosta�a zadeklarowana jako synchronizedi wobec tego nie moe by� uywana równocze�nie przez dwa lub wi�cej w�tków. Zatem gdydrugi z w�tków potomnych rozpoczyna dzia�anie, nie moe wywo�a� metody sumArray(),dopóki nie wykona jej pierwszy w�tek. Synchronizacja dost�pu do metody gwarantuje w tymwypadku poprawny wynik jej dzia�ania.

Aby w pe�ni zrozumie� efekt s�owa kluczowego synchronized, spróbuj usun�� je z deklaracjimetody sumArray(). Dost�p do tej metody przestanie podlega� synchronizacji i wiele w�tkówb�dzie mog�o jej uywa� równocze�nie. Problem polega na tym, e suma cz��ciowa jest prze-chowywana w sk�adowej sum, która jest modyfikowana przez kady w�tek wywo�uj�cy metod�sumArray() dla obiektu sa zadeklarowanego jako static. Je�li zatem dwa w�tki wywo�aj�równocze�nie metod� sa.sumArray(), wyniki jej dzia�ania b�d� niepoprawne, poniewa sk�a-dowa sum b�dzie przechowywa� na przemian sumy cz��ciowe obliczane przez kady z w�t-ków. Poniej przedstawi�em przyk�ad dzia�ania programu po usuni�ciu s�owa kluczowegosynchronized z deklaracji metody sumArray() (wynik dzia�ania w Twoim przypadku moesi� róni�).

W�tek potomny nr 1 rozpoczyna dzia�anie.W�tek potomny nr 2 rozpoczyna dzia�anie.W�tek potomny nr 1 wyliczy� sum� cz��ciow� równ� 1W�tek potomny nr 2 wyliczy� sum� cz��ciow� równ� 1W�tek potomny nr 1 wyliczy� sum� cz��ciow� równ� 3W�tek potomny nr 1 wyliczy� sum� cz��ciow� równ� 8W�tek potomny nr 2 wyliczy� sum� cz��ciow� równ� 8W�tek potomny nr 2 wyliczy� sum� cz��ciow� równ� 11W�tek potomny nr 1 wyliczy� sum� cz��ciow� równ� 15W�tek potomny nr 1 wyliczy� sum� cz��ciow� równ� 20W�tek potomny nr 2 wyliczy� sum� cz��ciow� równ� 24W�tek potomny nr 2 wyliczy� sum� cz��ciow� równ� 29W�tek potomny nr 1 wyliczy� sum� równ� 24W�tek potomny nr 1 koczy dzia�anie.W�tek potomny nr 2 wyliczy� sum� równ� 29W�tek potomny nr 2 koczy dzia�anie.

384 Java. Przewodnik dla pocz�tkuj�cych

Powysze informacje pokazuj�, e oba w�tki potomne wywo�uj� równocze�nie metod�sa.sumArray(), przypisuj�c sk�adowej sum niew�a�ciwe warto�ci. Zanim przejdziemy do nast�p-nego zagadnienia, podsumujmy najwaniejsze fakty zwi�zane z synchronizacj� metod:

� synchronizacja metody polega na umieszczeniu s�owa kluczowego synchronizedw deklaracji metody;

� synchronizacja dost�pu do metody powoduje, e jej wywo�anie dla dowolnego obiektupowoduje jego zablokowanie i aden inny w�tek nie moe wywo�a� dla tego samegoobiektu adnej metody zadeklarowanej jako synchronized;

� inne w�tki próbuj�ce wywo�a� metod� zadeklarowan� jako synchronized dla obiektu,do którego dost�p zosta� zablokowany przez monitor, przechodz� w stan oczekiwaniado momentu, w którym obiekt zostanie odblokowany;

� gdy w�tek ko�czy wykonywanie metody synchronized, dost�p do obiektu zostajeodblokowany.

Synchronizacja instrukcjiChocia deklarowanie metod jako synchronized stanowi prosty i efektywny sposób wyko-rzystania mechanizmu synchronizacji, nie sprawdza si� on we wszystkich sytuacjach. Naprzyk�ad moe wyst�pi� konieczno�� zapewnienia synchronizacji dost�pu do metody, któranie zosta�a zadeklarowana jako synchronized. Moe si� to zdarzy�, gdy uywasz cudzychklas i nie masz dost�pu do ich kodu ród�owego. Nie moesz zatem doda� s�owa kluczowegosynchronized w deklaracji interesuj�cej Ci� metody. W jaki sposób moesz zatem zapewni�synchronizacj� dost�pu do obiektu tej klasy? Rozwi�zanie tego problemu jest na szcz��ciebardzo proste: wystarczy umieszcza� wywo�ania metod tej klasy w bloku oznaczonym jakosynchronized.

Poniej przedstawi�em ogóln� posta� bloku synchronized:synchronized(refobj) { // instrukcje wymagaj�ce synchronizacji}

W tym przypadku refobj jest referencj� obiektu, do którego dost�p wymaga synchronizacji.Gdy w�tek rozpocznie wykonywanie bloku synchronized, aden inny w�tek nie moe wywo�a�metody dla obiektu refobj, dopóki bie�cy w�tek nie opu�ci tego bloku.

Kolejny sposób synchronizacji wywo�a� metody sumArray() polega zatem na ich umieszczeniuw bloku synchronized. Ilustruje to wersja programu przedstawiona na listingu 11.9.

Listing 11.9. Sync2.java

// U�ywa bloku synchronized// dla synchronizacji dost�pu// do metody sumArray.class SumArray { private int sum;

Rozdzia� 11. � Programowanie wielow�tkowe 385

int sumArray(int nums[]) { W tym wypadku dost�p do metody sumArray() sum = 0; // zeruje sum� nie podlega synchronizacji.

for(int i=0; i<nums.length; i++) { sum += nums[i]; System.out.println(Thread.currentThread().getName() + " wyliczy� sum� cz��ciow� równ� " + sum); try { Thread.sleep(10); // umo�liwia prze��czenie w�tków } catch(InterruptedException exc) { System.out.println("W�tek zosta� przerwany."); } } return sum; }}

class MyThread implements Runnable { Thread thrd; static SumArray sa = new SumArray(); int a[]; int answer;

// Tworzy nowy w�tek. MyThread(String name, int nums[]) { thrd = new Thread(this, name); a = nums;

thrd.start(); // uruchamia w�tek }

// Rozpoczyna wykonywanie nowego w�tku. public void run() { int sum;

System.out.println(thrd.getName() + " rozpoczyna dzia�anie.");

// synchronizuje wywo�ania metody sumArray() synchronized(sa) { Synchronizacja wywo�a� metody sumArray() dla obiektu sa.

answer = sa.sumArray(a); } System.out.println(thrd.getName() + " wyliczy� sum� równ� " + answer);

System.out.println(thrd.getName() + " koczy dzia�anie."); }}

class Sync2 { public static void main(String args[]) { int a[] = {1, 2, 3, 4, 5};

MyThread mt1 = new MyThread("W�tek potomny nr 1", a); MyThread mt2 = new MyThread("W�tek potomny nr 2", a);

try { mt1.thrd.join();

386 Java. Przewodnik dla pocz�tkuj�cych

mt2.thrd.join(); } catch(InterruptedException exc) { System.out.println("W�tek g�ówny zosta� przerwany."); } }}

Wynik dzia�ania tej wersji programu b�dzie poprawny, taki sam jak w przypadku wykorzy-stania metody zadeklarowanej jako synchronized.

Ekspert odpowiada

Pytanie: S�ysza�em co� o „API wspó�bie�no�ci”. Do czego one s�u��? Do czego s�u�y szkieletFork/Join?

Odpowied: API wspó�bie�no�ci udost�pniono w pakiecie java.util.concurrent (i jego pakietachpodrz�dnych) w celu umo�liwienia w Javie programowania wspó�bie�nego. Klasy te implementuj�mi�dzy innymi synchronizatory, pule w�tków, mened�ery wykonania i blokady umo�liwiaj�ce sterowa-nie wykonaniem w�tków. Jedn� z najciekawszych mo�liwo�ci oferowanych przez API wspó�bie�no�cijest szkielet Fork/Join wprowadzony w JDK 7.

Szkielet ten umo�liwia tak zwane programowanie równoleg�e. Nazwy tej u�ywa si� do okre�leniatechnik pozwalaj�cych wykorzysta� zalety komputerów o dwu lub wi�cej procesorach (w��czaj�c w tosystemy wielordzeniowe) poprzez podzia� zadania na podzadania i wykonywanie ka�dego podzada-nia na osobnym procesorze. Rozwi�zanie takie pozwala zwi�kszy� szybko�� wykonywania dzia�aniai poprawi� efektywno�� systemu. Podstawow� zalet� szkieletu Fork/Join jest �atwo�� u�ycia. Upraszczaon tworzenie kodu wielow�tkowego, który automatycznie skaluje si� tak, aby wykorzysta� liczb�procesorów dost�pnych w systemie. Tym samym sprowadza tworzenie rozwi�za� wspó�bie�nych dopoziomu nie trudniejszego ni� typowe zadania programowania, takie jak na przyk�ad operacje naelementach tablicy. API wspó�bie�no�ci, a w szczególno�ci szkielet Fork/Join, warte s� poznania, gdynabierzesz wi�kszego do�wiadczenia w tworzeniu programów wielow�tkowych.

Komunikacja mi�dzyw�tkowaRozwamy nast�puj�c� sytuacj�. W�tek T wykonuje w�a�nie metod� zadeklarowan� jakosynchronized i wymaga dost�pu do zasobu R, który jest tymczasowo niedost�pny. Co powi-nien zrobi� w�tek T? Je�li zacznie sprawdza� w p�tli dost�pno�� zasobu R, to zablokujeuywany obiekt, uniemoliwiaj�c dost�p innym w�tkom. Rozwi�zanie takie jest dalekie odoptymalnego, poniewa cz��ciowo redukuje zalety programowania wielow�tkowego. Lepiejb�dzie, je�li w�tek T zwolni tymczasowo wykorzystywany obiekt, umoliwiaj�c wykonywanieinnych w�tków. Gdy zasób R stanie si� dost�pny, w�tek T zostanie powiadomiony i wznowidzia�anie. Takie rozwi�zanie wymaga jednak komunikacji mi�dzyw�tkowej, dzi�ki której jedenw�tek moe powiadomi� inne, e zosta� zablokowany, a sam zosta� powiadomiony, e moewznowi� dzia�anie. Java umoliwia komunikacj� mi�dzyw�tkow� za pomoc� metod wait(),notify() i notifyAll().

Metody wait(), notify() i notifyAll() s� dost�pne dla kadego obiektu, poniewa zosta�yzaimplementowane w klasie Object. Metody te mog� by� wywo�ywane tylko w kontek�cie

Rozdzia� 11. � Programowanie wielow�tkowe 387

dzia�ania mechanizmu synchronizacji. Uywamy ich w nast�puj�cy sposób. Gdy w�tek zostajeczasowo zablokowany, wywo�uje metod� wait(). Wykonanie w�tku zostaje zawieszone,a monitor obiektu zwalnia blokad�, umoliwiaj�c innemu w�tkowi dost�p do obiektu. Zawie-szony w�tek wznowi pó niej swoje dzia�anie, gdy inny w�tek wywo�a dla tego samego obiektumetod� notify() lub notifyAll().

Poniej przedstawi�em róne wersje metody wait() zdefiniowane w klasie Object:final void wait( ) throws InterruptedExceptionfinal void wait(long milisekund) throws InterruptedExceptionfinal void wait(long milisekund, int nanosekund) throws InterruptedException

Pierwsza wersja zawiesza wykonywanie w�tku do momentu wywo�ania metody notify() lubnotifyAll(). Druga podobnie, ale w�tek nie b�dzie oczekiwa� d�uej ni podan� liczb�milisekund. Trzecia wersja umoliwia jeszcze dok�adniejsze okre�lenie maksymalnego czasuoczekiwania z dok�adno�ci� do pojedynczych nanosekund.

Poniej przedstawi�em ogóln� posta� metod notify() i notifyAll():final void notify( )final void notifyAll( )

Wywo�anie metody notify() powoduje wznowienie wykonywania oczekuj�cego w�tku.Wywo�anie metody notifyAll() powiadamia wszystkie w�tki, a dost�p do obiektu uzyskujew�tek o najwyszym priorytecie.

Zanim przyjrzymy si� przyk�adowi zastosowania tych metod, musz� uczyni� jeszcze jedn�wan� uwag�. Chocia w normalnych warunkach metoda wait() powoduje oczekiwaniew�tku na wywo�anie metody notify() lub notifyAll(), istnieje bardzo rzadko spotykanamoliwo��, e w�tek zako�czy oczekiwanie na skutek tak zwanego fa�szywego przebudzenia.Omówienie skomplikowanych warunków, które prowadz� do takiej sytuacji, wykracza pozazakres tej ksi�ki. Ze wzgl�du na moliwo�� wyst�pienia fa�szywego przebudzenia w�tkufirma Oracle zaleca wywo�ywanie metody wait() w p�tli sprawdzaj�cej warunek, na któregospe�nienie oczekuje w�tek. W nast�pnym przyk�adzie zastosujemy t� technik�.

Przyk�ad u�ycia metod wait() i notify()

Aby �atwiej Ci by�o zrozumie� zastosowania metod wait() i notify(), stworzymy teraz programsymuluj�cy tykanie zegara przez wy�wietlanie na przemian s�ów „tik” i „tak”. W tym celustworzymy klas� TickTock zawieraj�c� dwie metody: tick() i tock(). Metoda tick() wy�wie-tli s�owo "tik", a metoda tock() s�owo "tak". Aby uruchomi� symulacj� zegara, utworzymydwa w�tki, z których jeden b�dzie wywo�ywa� metod� tick(), a drugi metod� tock(). W�tkite musz� by� wykonywane w taki sposób, aby program wy�wietla� na przemian s�owa „tik”i „tak”. Kod ród�owy programu przedstawi�em na listingu 11.10.

Listing 11.10. ThreadCom.java

// U�ywa metod wait() i notify()// do stworzenia symulacji zegara.

class TickTock {

388 Java. Przewodnik dla pocz�tkuj�cych

String state; // przechowuje stan zegara

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() Metoda tick() powiadamia metod� tock(). try { while(!state.equals("tocked")) wait(); // oczekuje na zakoczenie metody tock() Metoda tick() czeka na zako�czenie

} metody tock().

catch(InterruptedException exc) { System.out.println("W�tek zosta� przerwany."); } }

synchronized void tock(boolean running) { if(!running) { // zatrzymuje zegar state = "tocked"; notify(); // powiadamia oczekuj�cy w�tek return; }

System.out.println("tak");

state = "tocked"; // zmienia stan zegara na "tocked"

notify(); // umo�liwia wykonanie metody tick() Metoda tock() powiadamia metod� tick().

try { while(!state.equals("ticked")) wait(); // oczekuje na zakoczenie metody tick() Metoda tock() czeka

} na zako�czenie metody tick().

catch(InterruptedException exc) { System.out.println("W�tek zosta� przerwany."); } }}

class MyThread implements Runnable { Thread thrd; TickTock ttOb;

// Tworzy nowy w�tek. MyThread(String name, TickTock tt) { thrd = new Thread(this, name); ttOb = tt; thrd.start(); // uruchamia w�tek } // Rozpoczyna wykonywanie nowego w�tku.

Rozdzia� 11. � Programowanie wielow�tkowe 389

public void run() {

if(thrd.getName().compareTo("tik") == 0) { for(int i=0; i<5; i++) ttOb.tick(true); ttOb.tick(false); } else { for(int i=0; i<5; i++) ttOb.tock(true); ttOb.tock(false); } }}

class ThreadCom { public static void main(String args[]) { TickTock tt = new TickTock(); MyThread mt1 = new MyThread("tik", tt); MyThread mt2 = new MyThread("tak", tt);

try { mt1.thrd.join(); mt2.thrd.join(); } catch(InterruptedException exc) { System.out.println("W�tek g�ówny zosta� przerwany."); } }}

A oto wynik dzia�ania tego programu:tik taktik taktik taktik taktik tak

Przyjrzyjmy si� bliej dzia�aniu tego programu. Sercem symulacji zegara jest klasa TickTock.Zawiera ona dwie metody, tick() i tock(), które komunikuj� si� ze sob�, aby zagwarantowa�,e po metodzie tick() zostanie zawsze wykonana metoda tock(), a po niej znowu metodatick() i tak dalej. Zwró� uwag� na sk�adow� state. Gdy dzia�a symulacja zegara, sk�adowastate przechowuje �a�cuch "ticked" lub "tocked" informuj�cy o bie�cym stanie zegara.Metoda main() tworzy obiekt tt klasy TickTock i uywa go do uruchomienia dwóch w�tkówpotomnych.

W�tki te opieraj� si� na obiektach typu MyThread. Konstruktor klasy MyThread ma dwa para-metry. Pierwszym jest nazwa w�tku, "tik" lub "tak". Drugim jest referencja obiektu typuTickTock, tt w tym przypadku. Wewn�trz metody run() klasy MyThread wywo�ana zostajemetoda tick(), je�li nazw� w�tku jest "tik". Je�li nazw� jest "tak", wywo�ana zostaje metodatock(). Kada z tych metod zostaje wywo�ana pi�� razy z argumentem true. Ostatnie wywo�a-nie przekazuje kadej metodzie argument false, co powoduje zatrzymanie symulacji zegara.

Najwaniejsz� cz��� symulacji zegara stanowi� metody tick() i tock() klasy TickTock. Przyj-rzyjmy si� metodzie tick(), której kod przedstawi�em poniej.

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 zakoczenie 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 synchronizacjidost�pu do metod. Metoda rozpoczyna dzia�anie od sprawdzenia warto�ci parametru running.Parametr ten jest uywany 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 umoliwi� 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() umoliwia wznowienie dzia�aniaw�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 wykonywaniametody 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 tow�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�aniemetody tock(), po którym znowu nast�puje wywo�anie metody tick() i tak dalej. Dzia�anietych metod jest wzajemnie zsynchronizowane.

Rozdzia� 11. � Programowanie wielow�tkowe 391

Po zatrzymaniu zegara metoda notify() zostaje wywo�ana ostatni raz, aby wznowi� dzia�aniedrugiego w�tku. Pami�taj, e metody tick() i tock() wywo�uj� zawsze metod� wait() powy�wietleniu komunikatu. Zatem gdy zegar zostanie zatrzymany, jeden z w�tków b�dzie si�znajdowa� w stanie oczekiwania. Jego dzia�anie mona wznowi� w�a�nie za pomoc� ostatniegowywo�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() spowodujewywo�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() oczekujewtedy 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 ponisz�wersj�, z której usun��em wywo�ania metod wait() i notify().

// Bez wywo�a metod wait() i notify().

class TickTock {

String state; // przechowuje stan zegara

synchronized void tick(boolean running) { if(!running) { // zatrzymuje zegar state = "ticked"; return; }

System.out.print("tik ");

state = "ticked"; // zmienia stan zegara na "ticked"

}

synchronized void tock(boolean running) { if(!running) { // zatrzymuje zegar state = "tocked"; return; }

System.out.println("tak");

state = "tocked"; // zmienia stan zegara na "tocked" }}

Po zast�pieniu klasy TickTock now� wersj� program wy�wietli ponisze komunikaty:tik tik tik tik tik taktaktaktaktak

Metody tick() i tock() nie wspó�pracuj� ju ze sob�!

392 Java. Przewodnik dla pocz�tkuj�cych

Ekspert odpowiada

Pytanie: Spotka�em si� z terminem zakleszczenie w odniesieniu do nieprawid�owo dzia�aj�cychprogramów wielow�tkowych. Na czym polega ta sytuacja i jak jej unika�? Na czym polega sytu-acja wy�cigu i jak mog� jej unikn��?

Odpowied: Zakleszczenie, jak wskazuje nazwa, jest sytuacj�, w której jeden w�tek czeka, a� drugiw�tek wykona pewn� operacj�, ale drugi w�tek czeka w�a�nie na pierwszy. Dzia�anie obu w�tków jestwstrzymane, w�tki oczekuj� na siebie wzajemnie. Przypomina to troch� dwie nadzwyczaj uprzejmeosoby, które nie mog� przekroczy� progu, poniewa� ka�da chce ust�pi� drugiej.

Unikanie zakleszcze� wydaje si� proste, ale takie nie jest. Sama analiza kodu programu cz�sto niewystarcza do ustalenia przyczyny zakleszczenia, poniewa� w czasie wykonania programu mi�dzyw�tkami mog� zachodzi� skomplikowane zale�no�ci czasowe. Unikanie zakleszcze� wymaga dba-�o�ci w programowaniu oraz wszechstronnego testowania. Pami�taj, �e je�li program wielow�tkowyczasami zawiesza si�, to najbardziej prawdopodobn� tego przyczyn� jest w�a�nie zakleszczenie.

Sytuacja wy�cigu wyst�puje, gdy dwa (lub wi�cej) w�tków próbuje uzyska� równocze�nie dost�p dowspó�dzielonego zasobu, ale odbywa si� to bez odpowiedniej synchronizacji. Na przyk�ad jeden w�tekmo�e przypisywa� zmiennej now� warto��, podczas gdy inny w�tek w tym samym czasie zwi�kszawarto�� tej samej zmiennej. Je�li nie zastosujemy synchronizacji, to wynik tych operacji b�dzie zale-�e� od kolejno�ci wykonania w�tków (czy drugi w�tek najpierw zwi�kszy oryginaln� warto�� zmien-nej, czy raczej pierwszy w�tek zd��y przypisa� jej wcze�niej now� warto��?). W takich sytuacjachmówi si� o wy�cigu w�tków, poniewa� ostateczny wynik operacji zale�y od tego, który w�tek b�dziepierwszy. Podobnie jak w przypadku zakleszczenia wykrycie sytuacji wy�cigu mo�e by� trudne. Naj-lepszym rozwi�zaniem jest zapobieganie: staranne programowanie z zastosowaniem odpowiedniejsynchronizacji dost�pu do wspó�dzielonych zasobów.

Wstrzymywanie, wznawianiei koczenie dzia�ania w�tków

Moliwo�� wstrzymania wykonywania w�tku bywa przydatna w pewnych sytuacjach. Naprzyk�ad osobny w�tek moe wy�wietla� czas. Je�li uytkownik nie chce ogl�da� zegara,wtedy mona wstrzyma� dzia�anie w�tku, który go wy�wietla. Niezalenie od przyczyny wstrzy-manie wykonywania w�tku nie powinno stanowi� problemu. Podobnie jak pó niejsze wzno-wienie jego dzia�ania.

Mechanizm wstrzymywania, wznawiania i ko�czenia dzia�ania w�tków róni si� we wcze-snych i obecnych wersjach Javy. W wersjach wcze�niejszych ni Java 2 do wstrzymywania,wznawiania i ko�czenia dzia�ania w�tków s�uy�y odpowiednio metody suspend(), resume()i stop() zdefiniowane w klasie Thread. Maj� one nast�puj�c� posta�:

final void resume( )final void suspend( )final void stop( )

Mimo e metody te wydaj� si� w�a�ciwym rozwi�zaniem kwestii zarz�dzania wykonaniemw�tków, obecnie ich uycie nie jest zalecane. W Javie 2 uznano metod� suspend() klasyThread za przestarza��. Powodem by�a moliwo�� doprowadzenia w pewnych sytuacjach do

Rozdzia� 11. � Programowanie wielow�tkowe 393

zakleszcze� na skutek uycia tej metody. Metod� resume() równie uznano za przestarza��. Niepowodowa�a ona adnych problemów, ale jej uycie bez metody suspend() nie mia�o sensu.Metod� stop() równie uznano za przestarza�� w Javie 2, poniewa w pewnych warunkachjej uycie mog�o by� przyczyn� powanych problemów.

Skoro nie mona ju uywa� metod suspend(), resume() i stop() do sterowania dzia�aniemw�tku, mog�oby si� wydawa�, e nie ma sposobu, by wstrzyma�, wznowi� lub zako�czy�wykonywanie w�tku. Nic bardziej b��dnego. Wystarczy zaprojektowa� w�tek w taki sposób,aby metoda run() sprawdza�a okresowo, czy powinna wstrzyma�, wznowi� lub zako�czy�swoje dzia�anie. Zwykle osi�ga si� to przez wprowadzenie w klasie w�tków dwóch znaczników:jednego dla wstrzymania i wznowienia w�tku i drugiego dla zatrzymania w�tku. W przypadkuoperacji wstrzymania i wznowienia w�tku, je�li odpowiedni znacznik nie jest ustawiony,metoda run() musi kontynuowa� wykonywanie w�tku. W przeciwnym razie musi wstrzyma�swoje dzia�anie. Je�li ustawiony jest drugi ze znaczników, oznaczaj�cy zatrzymanie w�tku,metoda run() musi zako�czy� dzia�anie.

Na listingu 11.11 przedstawi�em jeden ze sposobów implementacji w�asnych wersji metodsuspend(), resume() i stop().

Listing 11.11. Suspend.java

// Wstrzymywanie, wznawianie i zatrzymywanie w�tku.

class MyThread implements Runnable { Thread thrd; boolean suspended; Powoduje wstrzymanie wykonania w�tku, gdy ma warto�� true.

boolean stopped; Powoduje zako�czenie wykonania w�tku, gdy ma warto�� true.

MyThread(String name) { thrd = new Thread(this, name); suspended = false; stopped = false; thrd.start(); }

// Punkt wej�cia do w�tku. public void run() { System.out.println(thrd.getName() + " rozpoczyna dzia�anie."); try { for(int i = 1; i < 1000; i++) { System.out.print(i + " "); if((i%10)==0) { System.out.println(); Thread.sleep(250); }

// U�ywa bloku synchronized, aby sprawdzi� // warto�ci sk�adowych suspended i stopped. synchronized(this) { Ten blok synchronized sprawdza warto�ci sk�adowych

while(suspended) { suspended i stopped.

wait(); } if(stopped) break; }

394 Java. Przewodnik dla pocz�tkuj�cych

} } catch (InterruptedException exc) { System.out.println(thrd.getName() + " zosta� przerwany."); } System.out.println(thrd.getName() + " koczy dzia�anie."); }

// Zatrzymuje w�tek. synchronized void mystop() { stopped = true;

// Poni�sze instrukcje umo�liwiaj� zatrzymanie w�tku, // którego wykonanie zosta�o wstrzymane. suspended = false; notify(); }

// Wstrzymuje dzia�anie w�tku. synchronized void mysuspend() { suspended = true; }

// Wznawia dzia�anie w�tku. synchronized void myresume() { suspended = false; notify(); }}

class Suspend { public static void main(String args[]) { MyThread ob1 = new MyThread("W�tek potomny klasy MyThread");

try { Thread.sleep(1000); // umo�liwia rozpocz�cie wykonywania w�tku ob1

ob1.mysuspend(); System.out.println("Wstrzymuj� w�tek."); Thread.sleep(1000);

ob1.myresume(); System.out.println("Wznawiam w�tek."); Thread.sleep(1000);

ob1.mysuspend(); System.out.println("Wstrzymuj� w�tek."); Thread.sleep(1000);

ob1.myresume(); System.out.println("Wznawiam w�tek."); Thread.sleep(1000);

ob1.mysuspend(); System.out.println("Zatrzymuj� w�tek."); ob1.mystop();

Rozdzia� 11. � Programowanie wielow�tkowe 395

} catch (InterruptedException e) { System.out.println("W�tek g�ówny zosta� przerwany"); }

// czeka na zakoczenie w�tku try { ob1.thrd.join(); } catch (InterruptedException e) { System.out.println("W�tek g�ówny zosta� przerwany"); }

System.out.println("W�tek g�ówny koczy dzia�anie."); }}

Poniej przedstawi�em rezultat dzia�ania programu (moe nieco róni� si� w Twoim przypadku).W�tek potomny klasy MyThread rozpoczyna dzia�anie.1 2 3 4 5 6 7 8 9 1011 12 13 14 15 16 17 18 19 2021 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40Wstrzymuj� w�tek.Wznawiam w�tek.41 42 43 44 45 46 47 48 49 5051 52 53 54 55 56 57 58 59 6061 62 63 64 65 66 67 68 69 7071 72 73 74 75 76 77 78 79 80Wstrzymuj� w�tek.Wznawiam w�tek.81 82 83 84 85 86 87 88 89 9091 92 93 94 95 96 97 98 99 100101 102 103 104 105 106 107 108 109 110111 112 113 114 115 116 117 118 119 120Zatrzymuj� w�tek.W�tek potomny klasy MyThread koczy dzia�anie.W�tek g�ówny koczy dzia�anie.

Program ten dzia�a w nast�puj�cy sposób. Klasa MyThread definiuje dwie zmienne typu booleano nazwach suspended i stopped, które zarz�dzaj� operacjami wstrzymania i zatrzymania w�tku.Konstruktor klasy MyThread nadaje tym zmiennym warto�� pocz�tkow� false. Metoda run()zawiera blok synchronized, który sprawdza warto�� zmiennej suspended. Je�li jest ona równatrue, wywo�uje metod� wait(), aby wstrzyma� dzia�anie w�tku. Aby wstrzyma� dzia�aniew�tku, wywo�ujemy metod� mysuspend(), która nadaje zmiennej suspended warto�� true.Aby wznowi� w�tek, wywo�ujemy metod� myresume(), która nadaje zmiennej suspendedwarto�� false i wywo�uje metod� notify().

Aby zako�czy� w�tek, wywo�ujemy metod� mystop(), która nadaje zmiennej stopped warto��true. Dodatkowo metoda mystop() nadaje zmiennej suspended warto�� false, a nast�pniewywo�uje metod� notify(). Jest to konieczne, aby zako�czy� w�tek, którego wykonanie zosta�owcze�niej wstrzymane.

396 Java. Przewodnik dla pocz�tkuj�cych

Ekspert odpowiada

Pytanie: Wielow�tkowo�� wydaje si� by� doskona�ym sposobem poprawy efektywno�ci moichprogramów. Czy mo�esz poda� wskazówk�, jak najefektywniej korzysta� z tego mechanizmu?

Odpowied: Klucz do efektywnego wykorzystania wielow�tkowo�ci polega na przestawieniu si� z my�le-nia kategoriami sekwencyjnego dzia�ania na bardziej równoleg�e. Na przyk�ad gdy w Twoim progra-mie istniej� dwa podsystemy dzia�aj�ce zupe�nie niezale�nie od siebie, powiniene� powa�nie rozwa-�y� mo�liwo�� zaimplementowania ich jako osobnych w�tków. Jedno s�owo przestrogi. Je�li stworzyszzbyt wiele w�tków, mo�esz pogorszy� efektywno�� dzia�ania programu, zamiast j� poprawi�. Pami�-taj o narzucie zwi�zanym z prze��czaniem kontekstu wykonania w�tków. Je�li Twój program uru-chomi zbyt wiele w�tków, wi�kszo�� czasu procesora zajmie prze��czanie kontekstu w�tków, a niewykonanie programu!

Przyk�ad 11.2. Wykorzystanie g�ównego w�tku

Wszystkie programy w Javie maj� przynajmniej jeden w�tek wykonania zwanyw�tkiem g�ównym. W�tek ten powstaje automatycznie w momencie uruchomienia

programu. Jak dot�d zaniedbywali�my istnienie w�tku g�ównego, ale w tym przyk�adzie prze-konasz si�, e mona si� nim pos�ugiwa� tak jak kadym innym w�tkiem.

1. Utwórz plik o nazwie UseMain.java.

2. Dost�p do w�tku g�ównego wymaga uzyskania obiektu typu Thread reprezentuj�cegoten w�tek. W tym celu wywo�amy metod� currentThread() zadeklarowan� jako staticw klasie Thread. Jej ogóln� posta� przedstawi�em poniej:

static Thread currentThread()

Metoda ta zwraca referencj� w�tku, w którym zosta�a wywo�ana. Zatem je�li wywo�amyj� w g�ównym w�tku, otrzymamy referencj� g�ównego w�tku. Dysponuj�c t� referencj�,moemy kontrolowa� dzia�anie g�ównego w�tku w taki sam sposób jak innych w�tków.

3. Wprowad w pliku tekst ród�owy programu przedstawiony na listingu 11.12. Programten pobiera referencj� w�tku g�ównego, a nast�pnie zmienia jego nazw� i priorytet.

Listing 11.12. UseMain.java

/* Przyk�ad 11.2

Sterowanie w�tkiem g�ównym.*/

class UseMain { public static void main(String args[]) { Thread thrd;

// Pobiera referencj� w�tku g�ównego. thrd = Thread.currentThread();

// Wy�wietla nazw� w�tku g�ównego. System.out.println("Nazwa w�tku g�ównego: " + thrd.getName());

UseMain.java

Rozdzia� 11. � Programowanie wielow�tkowe 397

// Wy�wietla priorytet w�tku g�ównego. System.out.println("Priorytet w�tku g�ównego: " + thrd.getPriority());

System.out.println();

// Konfiguruje nazw� i priorytet w�tku g�ównego. System.out.println("Zmieniam nazw� i priorytet w�tku g�ównego.\n"); thrd.setName("W�tek nr 1"); thrd.setPriority(Thread.NORM_PRIORITY+3);

System.out.println("Aktualna nazwa w�tku g�ównego: " + thrd.getName());

System.out.println("Bie��cy priorytet w�tku g�ównego: " + thrd.getPriority()); }}

4. Poniej przedstawi�em wynik dzia�ania tego programu:Nazwa w�tku g�ównego: mainPriorytet w�tku g�ównego: 5

Zmieniam nazw� i priorytet w�tku g�ównego.

Aktualna nazwa w�tku g�ównego: W�tek nr 1Bie��cy priorytet w�tku g�ównego: 8

5. Wykonuj�c operacje na w�tku g�ównym, powiniene� zachowa� ostrono��. Na przyk�ad:je�li umie�cisz na ko�cu metody main() kod przedstawiony poniej, to program nigdynie zako�czy swojego dzia�ania, poniewa b�dzie oczekiwa� na zako�czenie w�tkug�ównego!

try { thrd.join();} catch(InterruptedException exc) { System.out.println("W�tek przerwany");}

Test sprawdzaj�cy 1. W jaki sposób wielow�tkowo�� w Javie umoliwia tworzenie efektywniejszychprogramów?

2. Wielow�tkowo�� w Javie opiera si� na klasie _____________ i interfejsie_____________.

3. Dlaczego czasami, tworz�c w�tki, lepiej jest utworzy� klas� pochodn� klasy Thread,ni implementowa� interfejs Runnable?

4. Poka, jak uy� metody join() do oczekiwania na zako�czenie w�tku MyThrd.

398 Java. Przewodnik dla pocz�tkuj�cych

5. Zwi�ksz priorytet w�tku MyThrd o trzy poziomy ponad normalny.

6. Na czym polega efekt dodania s�owa kluczowego synchronized w deklaracji metody?

7. Metod wait() i notify() uywamy do _____________.

8. Zmodyfikuj klas� TickTock w taki sposób, aby rzeczywi�cie symulowa�a up�yw czasu.Zatem niech kady „tik” trwa pó� sekundy, podobnie „tak”. Kady tik-tak zajmiezatem jedn� sekund� (nie przejmuj si� czasem potrzebnym na prze��czenie w�tku).

9. Dlaczego w nowych programach nie naley uywa� metod suspend(), resume() i stop()?

10. Jaka metoda klasy Thread zwraca nazw� w�tku?

11. Co zwraca metoda isAlive()?

12. Spróbuj samodzielnie wprowadzi� synchronizacj� w klasie Queue stworzonejw poprzednich rozdzia�ach w taki sposób, aby zapewni� jej bezpieczne uycie w wieluw�tkach.

SkorowidzA

abstrakcyjna klasa bazowa, 284adnotacje, 400, 422

ogólnego przeznaczenia, 424znacznikowe, 424

algorytm sortowania Quicksort, 212, 216anonimowa klasa wewn�trzna, 221, 521API, Application Programming Interface, 279aplet, 22, 464, 467

bazuj�cy na AWT, 470MySwingApplet, 524obs�uguj�cy zdarzenia myszy, 483Swing, 522wy�wietlaj�cy baner, 471

apletyarchitektura, 467dzia�anie, 469parametry, 475szkielet, 468

architekturamodel-delegat, 493model-widok-nadzorca, 493z wydzielonym modelem, 493

argument, 127argument wieloznaczny, 438ASCII, 53, 339asercje, 488automatyczne

konwersje typów, 71opakowywanie, 413, 415, 418wypakowywanie, 413zarz�dzanie zasobami, 312, 336

AWT, Abstract Window Toolkit, 464, 492

Bbajt, 334bezpiecze�stwo, 23, 25biblioteka klas, 48, 279

biblioteka Swing, 464, 491bit, 176bitowe operatory przypisania, 181blok

finally, 309, 332kodu, 43static, 215synchronized, 384try, 299, 304, 312, 332

blokada, 381b��d

otwarcia pliku, 334niejednoznaczno�ci, 227, 457przekroczenia zakresu, 300sk�adni, 34w kodzie programu, 297wewn�trzne, 297

bufor, 80, 353buforowanie wierszy, 80

Ccia�o metody, 123czas istnienia zmiennej, 62

Ddefiniowanie klasy, 32, 117definiowanie pakietu, 270deklaracja

bloku static, 215klasy generycznej, 434klasy pochodnej, 232tablicy, 146, 155zmiennej, 36

dekoder, 353dekrementacja, 42, 65delegacja zdarze�, 481delegat interfejsu uytkownika, 493destruktor, 140

582 Java. Przewodnik dla pocz�tkuj�cych

dodawanie konstruktora do klasy, 137dope�nienie do dwóch, 180dost�p

do pakietu, 274do pliku, 343do sk�adowych, 190, 232, 273do sk�adowych klasy bazowej, 240do systemu, 34sekwencyjny, 343

drzewo hierarchii, 579dynamiczne zarz�dzanie pami�ci�, 139dynamiczno��, 25dynamiczny wybór metody, 255dziedziczenie, 28, 230, 232, 235, 241dziedziczenie wielobazowe, 232dzielenie przez zero, 68, 185

EEclipse, 29etykieta, 104etykieta done, 105etykieta jlabContents, 509

Ffa�szywe przebudzenie, 387funkcje wirtualne, 256

Ggenerowanie wyj�tku, 305generyczna klasa Queue, 448generyczno��, 427graficzny interfejs uytkownika, 467

Hhermetyzacja, 27hermetyzowanie tablicy, 192hierarchia

dziedziczenia, 28klas, 230, 241wielopoziomowa klas, 244wyj�tków, 296zawierania, 494

IIDE, 29identyfikator, 47implementacja, 279implementacja interfejsu, 281import sk�adowej Static.out, 422import sk�adowych statycznych, 400, 420

importowanie pakietu, 278inicjalizacja, 90

dynamiczna, 60obiektu, 206tablic wielowymiarowych, 153zmiennej, 59

inicjalizator, 62inkrementacja, 42, 65instrukcja

break, 86, 102break z etykiet�, 104continue, 108continue z etykiet�, 108default, 85, 89for, 41goto, 104if, 40, 81if-else-if, 83import, 277import static, 422new, 120, 136package, 270println(), 36return, 124super(), 238switch, 84, 85, 172throw, 297try, 338

instrukcjeiteracji, 79skoku, 79wyboru, 79

interfejs, 269, 279ActionListener, 504Annotation, 423AutoCloseable, 336Closeable, 336Containment, 447DataInput, 339ListSelectionListener, 514ListSelectionModel, 513MouseListener, 482MouseMotionListener, 482Queue, 286Runnable, 366Series, 283

interfejsydziedzicz�ce, 291generyczne, 445s�uchaczy zdarze�, 482

interpreter kodu bajtowego, 24, 31interpretowalno��, 25iteracja, 41

Skorowidz 583

JJ2SE, Java 2 Standard Edition, 14Java API, 279Java SE, 15JDK, Java Development Kit, 17, 29j�zyk C i C++, 21j�zyk C#, 22JFC, Java Foundation Classes, 492JIT, just-in-time, 24JVM, Java Virtual Machine, 24

Kkana�, 353klasa, 27, 115

ActionEvent, 503, 504Applet, 477ArithmeticException, 300Book, 274BookDemo, 274BufferedReader, 348, 352ByThrees, 283ByTwos, 281CircularQueue, 287Component, 470, 495Console, 345Container, 495DataInputStream, 339DataOutputStream, 339Error, 296ErrorInfor, 199ErrorMsg, 265Exception, 296FailSoftArray, 192FileInputStream, 330FileOutputStream, 330, 334FileReader, 351FileWriter, 350GenericMethodDemo, 443Help, 130InputStream, 328InputStreamReader, 352ItemEvent, 509JApplet, 522java.lang.Enum, 406JButton, 506JCheckBox, 509JComponent, 494JList, 512JTextField, 506ListSelectionEvent, 513Math, 53, 420MyThread, 367, 395

NonIntResultException, 316NumericFns, 435Object, 267OutputStreamWriter, 351Pair, 437PrintWriter, 349Pwr, 143Queue, 158, 194, 207, 448Quicksort, 217RandomAccessFile, 343Reader, 352RuntimeException, 313Scanner, 360ShowBits, 182, 221SimpleApplet, 465String, 167StringBuffer, 171Summation, 445Sup, 256System, 48, 279, 326Thread, 365, 374Throwable, 296, 307, 315TickTock, 389Timer, 212Triangle, 233, 250TwoDShape, 231, 250, 264Vehicle, 119Writer, 351

klasyabstrakcyjne, 260bazowe, 229generyczne, 428komponentów Swing, 495nadrz�dne, 28NIO, 353opakowuj�ce, 353–355pochodne, 229, 232pochodne klasy Exception, 315pochodne klasy Thread, 370strumieni bajtowych, 325strumieni znakowych, 326wewn�trzne, 219, 521zagniedone, 218zagniedone static, 222zdarze�, 481

klauzulacase, 85catch, 298, 302, 312else, 81extends, 435, 440finally, 309implements, 281throws, 311throws java.io.IOException, 80

584 Java. Przewodnik dla pocz�tkuj�cych

kod bajtowy, 24koder, 353kodowanie, 31kolejka, 158kolejka cykliczna, 288kolejka dynamiczna, 286komentarz, 32

dokumentacyjny, 573, 578jednowierszowy, 33wielowierszowy, 32

kompilator, 28kompilator javac, 31, 32kompilator JIT, 24kompilowanie programu, 24, 31komponent

JButton, 502JCheckBox, 509JList, 512JTextField, 506

komponenty Swing, 494komunikacja mi�dzyw�tkowa, 386konsola znakowa, 80konstruktor, 135

domy�lny, 238generyczny, 445klasy bazowej, 235, 238klasy Queue, 207klasy Thread, 369klasy Throwable, 315klasy Triangle, 236klasy TwoDShape, 237MyClass(), 206o jednym parametrze, 238Transport(), 405TwoDShape(), 252typu wyliczeniowego, 404z parametrem, 136

kontekst graficzny, 465kontener JApplet, 522kontener JFrame, 522kontenery szczytowe, 495konwersja typów w wyraeniach, 76konwersja typu, 71kopiowanie pliku, 335kopiowanie tablicy, 158

LLIFO, last-in, first-out, 28lista argumentów o zmiennej d�ugo�ci, 221lista JList, 512litera�y, 56

�a�cuchowe, 58znakowe, 59

��a�cuch wyj�tków, 315�a�cuch znaków, 58, 167

Mmaszyna wirtualna Java, 24meneder

BorderLayout, 501FlowLayout, 504, 505uk�adu, 496

metadane, 422metoda, 27, 33, 122metoda

abs(), 205absEqual(), 438actionPerformed(), 509addActionListener(), 506, 521area(), 261charAt(), 171close(), 331, 334compareTo(), 355, 406console(), 345destroy(), 470doubleValue(), 414, 435finalize(), 139floatValue(), 414generator(), 141generyczna arraysEqual(), 443genException(), 307get(), 286getActionCommand(), 503getClass(), 267getContentPane(), 500getErrorInfo(), 199getErrorMsg(), 199getob(), 430getParameter(), 475getSelectedIndex(), 513getSelectedIndices(), 514getSpeed(), 405getText(), 506init(), 469, 485invokeAndWait(), 501, 502invokeLater(), 501, 502isAlive(), 375isFactor(), 128join(), 375main(), 33makeGUI(), 524Math.abs(), 438Math.pow(), 420mouseClicked(), 482mouseDragged(), 482

Skorowidz 585

mouseEntered(), 482mouseExited(), 482mouseMoved(), 482noChange(), 197notify(), 386notifyAll(), 386ordinal(), 406ovlDemo(), 202paint(), 465, 470parseDouble(), 354print(), 37, 349println(), 34, 37, 349, 352printStackTrace(), 308prompt(), 311put(), 286range(), 122read(), 80, 328readLine(), 348readPassword(), 345reciprocal(), 435removeActionListener(), 506removeKeyListener(), 480repaint(), 470resume(), 392run(), 366, 393setActionCommand(), 506, 508setCharAt(), 171setName(), 369setPriority(), 378show(), 253showStatus(), 475showType(), 431sleep(), 367sqrt(), 53, 214start(), 469static, 214stop(), 392substring(), 171sumArray(), 384suspend(), 392System.console(), 345tick(), 387tock(), 387toString(), 308, 414update(), 471valueChanged(), 514values(), 403valuesOf(), 403vaTest(), 223vaTest(int ...), 227wait(), 386, 391write(), 334

metodyabstrakcyjne, 261, 279

dost�powe dla sk�adowych prywatnych, 233generyczne, 443klasy Applet, 477klasy InputStream, 327klasy Object, 267klasy OutputStream, 328klasy Reader, 346klasy Thread, 365klasy Throwable, 308klasy Writer, 347konwersji �a�cuchów, 354natywne, 488o zmiennej liczbie argumentów, 222rekurencyjne, 210p�cherzykowego, 216wej�cia klasy DataInputStream, 340wyj�cia klasy DataOutputStream, 339

model, 493model delegacji zdarze�, 479modyfikator

abstract, 261dost�pu, 33final, 312private, 33, 191, 194, 232protected, 190, 275public, 33, 190transient, 486volatile, 486

modyfikatory dost�pu, 190monitor, 381

Nnadzorca, 493najm�odszy bit, 180narzut, 420nawias klamrowy, 34nawiasy, 77nazwa

klasy, 138obiektu, 118pliku ród�owego, 30

NetBeans, 29niejednoznaczno��, 226niezaleno��, 25niezawodno��, 25

Oobiekt, 27, 116

ActionEvent, 503klasy String, 167przekazywany metodzie, 195System.err, 327System.in, 327

586 Java. Przewodnik dla pocz�tkuj�cych

obiektSystem.out, 327Thread, 369typu Integer, 431typu T, 437zablokowany, 381

obiektowo��, 25obliczanie silni, 210obs�uga

b��dów, 301, 317b��dów wej�cia-wyj�cia, 331plików, 350wej�cia konsoli, 328wyj�tków, 295wyj�cia konsoli, 329, 349zdarze�, 479zdarze� myszy, 482

odczyt konsoli, 345odczyt z pliku, 330odczyt znaków, 346odst�py, 77odwo�anie do obiektu, 120odzyskiwanie nieuytków, 139ogólna klasa akcji, 28ograniczanie argumentów wieloznacznych, 440ograniczanie typów, 434ograniczenia dla sk�adowych statycznych, 458ograniczenia tablic generycznych, 459ograniczenia zwi�zane z wyj�tkami, 460okno

apletu SimpletApplet, 466programu ListDemo, 515programu SwingFC, 516programu TFDemo, 508statusu, 475

opakowywanie, 414opcja classpath, 271operacja bitowa z operatorem przypisania, 181operacja get, 159operacja put, 159operacje na �a�cuchach, 168operator, 63

?, 184+, 36bitowy AND, 175bitowy NOT, 179bitowy OR, 177bitowy XOR, 178delete, 139diamentowy, 456instanceof, 486new, 120, 138, 146przypisania, 69, 121ternarny, 184

operatoryarytmetyczne, 64bitowe, 175logiczne, 66, 67logiczne warunkowe, 67przesuni�cia bitów, 180relacyjne, 40, 66skrótowe przypisania, 70z�oone przypisania, 70

Ppakiet, 190, 269

AWT, 465, 477bookpack, 272, 273bookpackext, 275, 276java, 279java.awt, 504java.awt.event, 479, 504java.io, 312, 324java.lang, 279java.lang.annotation, 423javax, 494javax.swing.event, 513mypack, 271NIO, 353Swing, 324, 493

pakiety Java API, 279panel szklany, 495panel warstw, 495panel zawarto�ci, 495parametr, 33, 127parametr T, 430parametry apletów, 475p�tla

do-while, 97for, 41, 90, 92, 162for rozszerzona, 166for-each, 162, 163while, 96

p�tlebez cia�a, 94niesko�czone, 94zagniedone, 112

plikBanner.java, 471BookDemo.java, 272Bubble.java, 149CompFiles.java, 341Example.class, 31Example.java, 30ExtendThread.java, 371Finalize.java, 140GalToLit.java, 39GalToLitTable.java, 45

Skorowidz 587

GenQDemo.java, 450Help.java, 88, 99Help3.java, 109HelpClassDemo.java, 130ICharQ.java, 286IGenQ.java, 448IQDemo.java, 288LogicalOpTable.java, 74QDemo.java, 159QDemo2.java, 207QExcDemo.java, 317QSDemo.java, 216ShowBitsDemo.java, 182Sound.java, 55SwingFC.java, 516TrafficLigthDemo.java, 408TruckDemo.java, 242UseMain.java, 396VehicleDemo.class, 118VehicleDemo.java, 118

pliki.class, 270HTML, 466o dost�pie swobodnym, 343pomocy, 356 ród�owe, 30

polimorfizm, 28, 204pomoc, 130, 355porównywanie plików, 341, 516posta� binarna, 176priorytet operatorów, 74priorytet w�tku, 378proces hermetyzacji, 414program, 30

appletviewer, 465, 522CopyFile, 337do zamiany liter, 176javadoc, 579SwingDemo, 498sygnalizacji �wietlnej, 408szyfruj�cy, 178wielow�tkowy, 363

programowanieobiektowe, 26równoleg�e, 386strukturalne, 26

przechwytywaniewyj�tków, 300wyj�tków klas pochodnych, 303wyj�tków klasy bazowej, 303

przeci�anie konstruktorów, 205przeci�anie metod, 201, 204, 225przekazywanie

argumentów, 196

argumentów w gór�, 247argumentu przez referencj�, 197argumentu przez warto��, 197obiektów, 195

przeno�no��, 23, 25przerwanie programu, Ctrl+C, 391przerywanie p�tli, 102przes�anianie metod, 252, 255przes�anianie metod w klasie TwoDShape, 257przes�anianie nazw, 63przestrze� nazw, 270przypisanie, 120przypisywanie referencji tablic, 155pusta instrukcja, 94

Rreferencje, 120

interfejsu, 284klasy bazowej, 248obiektów klas pochodnych, 250tablicy, 155

rekurencja, 210r�czne opakowywanie i wypakowywanie, 415rozproszono��, 25rozszerzenie .class, 31rozszerzenie .java, 30rzutowanie, 442rzutowanie typów, 72

Sschemat klasy Triangle, 231schemat tablicy, 147sekwencje specjalne, 57sekwencje znaków, 57selektor, 353separator, 44serwlet, 25sk�adnia (...), 226sk�adowa length, 156sk�adowa protected, 275, 278sk�adowa prywatna, 192sk�adowe klasy, 27s�owo kluczowe, 47

assert, 487class, 116enum, 403extends, 230, 291false, 47final, 264finally, 309import, 420instanceof, 487interface, 280, 423

588 Java. Przewodnik dla pocz�tkuj�cych

s�owo kluczowenative, 488null, 47public, 33static, 33, 212, 420strictfp, 487super, 237, 240, 253synchronized, 381this, 142, 240, 489transient, 486true, 47try i catch, 297void, 33volatile, 486

s�uchacz, 480specyfikacja zasobu, 336sta�a final, 266sta�e w�asnego typu, 400sta�e wspó�dzielone, 291sta�e wyliczeniowe, 400, 401sterowanie cyklem wykonania apletu, 468sterowanie instrukcj� switch, 172stos, 28, 158strumie�, 324

bajtowy, 324, 345b��dów, 327InputStream, 339InputStreamReader, 345predefiniowany, 327wej�cia, 324, 328wyj�cia, 324, 327znakowy, 324, 345znakowy FileReader, 352znakowy FileWriter, 351znakowy PrintWriter, 349

sygnatura, 205synchronizacja, 364, 380

dost�pu do metody, 381dost�pu do obiektu, 381instrukcji, 384metod, 381, 384

system ósemkowy, 57system pomocy, 355system szesnastkowy, 57szkielet apletu, 468

��cieka dost�pu do katalogu, 271�rednik, 44

Ttabela prawdy, 74tablice, 145

dwuwymiarowe, 151

jednowymiarowe, 146�a�cuchów, 170nieregularne, 152tablic, 165typu T, 460wielowymiarowe, 153

technologia HotSpot, 24terminologia Javy, 25tryb SINGLE_SELECTI, 513tworzenie

adnotacji, 423aplikacji Swing, 497, 522instancji T, 458�a�cuchów, 167obiektu, 117przycisku, 503w�tku, 365wielu w�tków, 372

typinterfejsu generycznego, 447logiczny, 54surowy, 452surowy klasy generycznej, 453wyliczeniowy, 404zmiennej, 36zmiennej referencyjnej, 250

typyca�kowite, 51danych, 37, 50generyczne, 413, 432ogólne, 267opakowuj�ce, 414podstawowe, 139zmiennoprzecinkowe, 52

UUnicode, 53ustawianie bitu, 176

Wwarto�� null, 348warto�� porz�dkowa, 407warto�� zmiennych, 62w�tek, 363

g�ówny, 365, 369, 396gotowy do wykonywania, 364ko�cz�cy dzia�anie, 376, 392potomny, 375priorytet, 378rozdzia�u zdarze�, 501wstrzymuj�cy dzia�anie, 392wykonywany, 364wznawiaj�cy dzia�anie, 392

Skorowidz 589

zablokowany, 364zako�czony, 364zawieszony, 364

wczytywanie �a�cuchów, 348widok, 493wielow�tkowo��, 25, 364, 396wielozadaniowo��, 364wiersz wywo�ania, 173wnioskowanie typów, 456wska nik, 26wska nik zawarto�ci pliku, 343wycieki pami�ci, 331wyj�tek, 295

ArithmeticException, 301, 313ArrayIndexOutOfBoundsException, 149, 298, 300,

304, 313AssertionError, 487FileNotFoundException, 334IOException, 311, 328

wyj�tkiniesprawdzane, 314sprawdzane, 314w klasie Queue, 317wbudowane w Jav�, 313

wyliczanie warto�ci, 220wyliczenie, 400wymazywanie, 457wyraenia, 75wy�cig, 392wywo�anie

konstruktora klasy bazowej, 237super.show(), 254System.in.read(), 80this(), 489konstruktorów, 247

Zzagniedanie

bloków, 62bloków try, 304instrukcji if, 82instrukcji switch, 88zasi�gów, 61

zakleszczenie, 392zamkni�cie pliku, 332zamykanie automatyczne pliku, 336zapis danych, 329zapis w pliku, 334zapis znaków w pliku, 350zapobieganie dziedziczeniu, 265zapobieganie przes�anianiu, 264zasi�g deklaracji, 95zasi�g deklaracji zmiennych, 60zbiór znaków, 353zdarzenia, 479

klasy, 480model delegacji, 481s�uchacze, 480 ród�a, 479

zdarzenie ListSelectionEvent, 513, 514zintegrowane �rodowisko programisty, 29zmienna, 27, 35, 59

final, 406iteracyjna, 162, 165minivan, 120referencyjna, 248, 285steruj�ca, 93�rodowiskowa CLASSPATH, 271

zmienne interfejsu, 280znacznik APPLET, 465znacznik OBJECT, 466znaczniki javadoc, 573znak +, 36znak komentarza, 277znaki, 53zwracanie obiektów, 199zwracanie warto�ci, 125

� ród�a zdarze�, 479

590 Java. Przewodnik dla pocz�tkuj�cych