Język Java wątki (streszczenie)

Podobne dokumenty
Język Java wątki (streszczenie)

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Współbieżność w środowisku Java

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Wielowątkowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Wątki w Javie. Piotr Tokarski

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Kurs programowania. Wykład 8. Wojciech Macyna

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Języki i Techniki Programowania II. Wykład 7. Współbieżność 1

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Aplikacje w Javie- wykład 11 Wątki-podstawy

6.1 Pojęcie wątku programu 6.2 Klasy Timer, TimerTask 6.3 Klasa Thread 6.4 Synchronizacja pracy wątków 6.5 Grupowanie wątków

Współbieżność w Javie

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Programowanie wielowątkowe. Tomasz Borzyszkowski

Podstawy współbieżności

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Współbieżność w Javie

Programowanie komputerów

Programowanie współbieżne i rozproszone

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 1

W Javie wątki są obiektami zdefiniowanymi za pomocą specjalnego rodzaju klas.

Java. Programowanie Obiektowe Mateusz Cicheński

4.1 Napisz kod, w którym definiujesz, tworzysz oraz uruchamiasz wątki z uŝyciem klas java.lang.thread oraz java.lang.runnable.

Stworzenie klasy nie jest równoznaczne z wykorzystaniem wielowątkowości. Uzyskuje się ją dopiero poprzez inicjalizację wątku.

Programowanie wielowątkowe: podstawowe koncepcje, narzędzia w Javie. J. Starzyński, JiMP2, rok akad. 2005/2006

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Interfejsy w Java. Przetwarzanie równoległe. Wątki.

WSPÓŁBIEŻNOŚĆ. MATERIAŁY:

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie współbieżne Wykład 5. Rafał Skinderowicz

Język Java część 2 (przykładowa aplikacja)

Wątki (Threads) Potrzeby. Przetwarzanie równoległe i współbieŝne. Cechy programowania wątkowego. Concurrent programming is like

Programowanie w Sieci Internet. Python: Wątki. Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Przetwarzanie równoległe i współbieżne

Język Java część 2 (przykładowa aplikacja)

Dokumentacja do API Javy.

Programowanie współbieżne Wykład 2. Rafał Skinderowicz

Zaawansowane programowanie w C++ (PCP)

Monitory. Jarosław Kuchta

Wykład 5. Synchronizacja (część II) Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Kompozycja i dziedziczenie klas

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Programowanie współbieżne Laboratorium nr 12

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Systemy Rozproszone - Ćwiczenie 4

Model pamięci. Rafał Skinderowicz

Programowanie obiektowe

Programowanie Obiektowe Java

Wykład 8: klasy cz. 4

Generatory. Michał R. Przybyłek

Wykład 6: Dziedziczenie

Multimedia JAVA. Historia

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

WIELOWĄTKOWOŚĆ. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Klasy abstrakcyjne i interfejsy

Wykład 4: Klasy i Metody

Polimorfizm. dr Jarosław Skaruz

7 Pewne uzupełnienia Przepływ sterowania Układacze... 6

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

1 Atrybuty i metody klasowe

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Klasy abstrakcyjne, interfejsy i polimorfizm

Systemy operacyjne. Zajęcia 11. Monitory

4. Procesy pojęcia podstawowe

4. Procesy pojęcia podstawowe

Java: interfejsy i klasy wewnętrzne

Wielowątkowość 1. Marcin Orchel. AGH University of Science and Technology in Poland 1 / 58

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Programowanie współbieżne Laboratorium nr 11

Podstawy programowania obiektowego

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

Przykłady interfejsu TCP i UDP w Javie

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Kolekcje - pakiet Java Collections Framework

Programowanie wielowątkowe. Jarosław Kuchta

1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)?

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Podstawy Języka Java

Technologie i usługi internetowe cz. 2

Programowanie obiektowe

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Zaawansowany kurs języka Python

PHP 5 język obiektowy

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Definiowanie własnych klas

Definiowanie własnych klas

Wykład 8: Obsługa Wyjątków

Wstęp do programowania 2

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Transkrypt:

Programowanie współbieŝna Język Java wątki (streszczenie) Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski @ pwr.wroc.pl Podstawowe pojęcia: procesy i wątki Proces to wykonujący się program wraz z dynamicznie przydzielanymi mu przez system zasobami (np. pamięcią operacyjną, zasobami plikowymi). KaŜdy proces ma własną przestrzeń adresową. Systemy wielozadaniowe pozwalają na równoległe (teoretycznie) wykonywanie wielu procesów, z których kaŝdy ma swój kontekst i swoje zasoby. Wątek to sekwencja działań, która wykonuje się w kontekście danego procesu (programu) KaŜdy proces ma co najmniej jeden wykonujący się wątek. W systemach wielowątkowych proces moŝe wykonywać równolegle (teoretycznie) wiele wątków, które wykonują się jednej przestrzeni adresowej procesu. Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr / 37 Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 2 / 37 Podstawowe pojęcia: procesy i wątki Równoległość działania wątków osiągana jest przez mechanizm przydzielania czasu procesora poszczególnym wykonującym się wątkom. KaŜdy wątek uzyskuje dostęp do procesora na krótki czas (kwant czasu), po czym oddaje procesor innemu wątkowi. Zmiana wątku wykonywanego przez procesor moŝe dokonywać się na zasadzie: współpracy (cooperative multitasking), wątek sam decyduje, kiedy oddać czas procesowa innym wątkom, wywłaszczania (pre-emptive multitasking), o dostępie wątków do procesora decyduje systemowy zarządca wątków, który przydziela wątkowi kwant czasu procesora, po upływie którego odsuwa wątek od procesora i przydziela kolejny kwant czasu innemu wątkowi. Java jest językiem wieloplatformowym, a róŝne systemy operacyjne stosują róŝne mechanizmy udostępniania wątkom procesora. Programy wielowątkowe powinny być tak pisane, by działały zarówno w środowisku współpracy jak i wywłaszczania Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 3 / 37 Tworzenie i uruchamianie wątków Uruchamianiem wątków i zarządzaniem nimi zajmuje się klasa Thread. Aby uruchomić wątek, naleŝy utworzyć obiekt klasy Thread i dla tego obiektu wywołać metodę start(). Kod wykonujący się jako wątek sekwencja działań wykonująca się równolegle z innymi działaniami programu określany jest przez obiekt implementujący interfejs Runnable, który zawiera deklarację metody run(). Metoda run() określa to co ma robić wątek. Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 4 / 37

Główne metody klasy Thread. Uruchamianie i zatrzymywanie wątków: start - uruchomienie wątku, stop zakończenie wątku (metoda niezalecana), run - kod wykonywany w ramach wątku. 2. Identyfikacja wątków: currentthread - metoda zwraca identyfikator wątku bieŝącego, setname - ustawienie nazwy wątku, getname -odczytanie nazwy wątku, isalive - sprawdzenie czy wątek działa, tostring - uzyskanie atrybutów wątku. 3. Priorytety i szeregowanie wątków: getpriority - odczytanie priorytetu wątku, setpriority - stawienie priorytetu wątku, yield - wywołanie szeregowania. Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 5 / 37 Główne metody klasy Thread c.d. 4. Synchronizacja wątków: sleep zawieszenie wykonania wątku na dany okres czasu, join - czekanie na zakończenie innego wątku, wait - czekanie w monitorze, notify - odblokowanie wątku zablokowanego na monitorze, notifyall - odblokowanie wszystkich wątków zablokowanych na monitorze, interrupt - odblokowanie zawieszonego wątku, suspend - zablokowanie wątku, resume - odblokowanie wątku zawieszonego przez suspend, setdaemon - ustanowienie wątku demonem, isdaemon - testowanie czy wątek jest demonem. Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 6 / 37 Tworzenie wątków MoŜliwe są dwa sposoby tworzenia nowego wątku: poprzez dziedziczenie klasy Thread poprzez implementację interfejsu Runnable. Sposób drugi stosujemy wówczas, gdy klasa reprezentująca wątek musi dziedziczyć po innej niŝ Thread klasie (Java nie dopuszcza dziedziczenia wielobazowego). Tworzenie wątku dziedziczenie klasy Thread Aby utworzyć wątek jako klasa potomna od klasy Thread naleŝy:. Utworzyć nową klasę (na przykład o nazwie Tklasa) jako potomną klasy Thread i nadpisać metodę run() klasy macierzystej. Metoda ta ma zawierać kod do wykonania w ramach tworzonego wątku. class TKlasa extends Thread... void run() // Kod wątku... 2. Utworzyć obiekt nowej klasy Tklasa (na przykład thr): TKlasa thr = new TKlasa(...); 3. Wykonać metodę start() klasy TKlasa dziedziczoną z klasy macierzystej: thr.start(); Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 7 / 37 Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 8 / 37

Tworzenie wątku dziedziczenie klasy Thread class NowyWatek extends Thread public void run() System.out.println(" Nowy watek : POCZATEK"); try for(int i = 5; i > ; i--) System.out.println(" Nowy watek: " + i); Thread.sleep(5); catch (InterruptedException e) System.out.println(" Nowy watek : KONIEC"); class GlownyWatek public static void main(string args[]) System.out.println(" Glowny watek: POCZATEK"); System.out.println(" Glowny watek: Tworze Nowy Watek"); NowyWatek nowywatek = new NowyWatek(); System.out.println(" Glowny watek: Uruchamiam Nowy watek"); nowywatek.start(); try for(int i = 5; i > ; i--) System.out.println(" Glowny watek: " + i); Thread.sleep(); catch (InterruptedException e) System.out.println(" Glowny watek: KONIEC"); działanie tworzenie uruchomienie działanie głównego watka Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 9 / 37 Tworzenie wątku dziedziczenie klasy Thread Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr / 37 Tworzenie wątku implement. interfejsu Runnable Aby utworzyć wątek korzystając z interfejsu Runnable naleŝy:. Utworzyć nową klasę (np. o nazwie RKlasa) dziedziczącą po interesującej na innej klasie (np. o nazwie InnaKlasa) i implementującą interfejs Runnable. W ramach tej nowej klasy utworzyć metodę run(), która wykonywała będzie Ŝądane czynności. class RKlasa extends InnaKlasa implements Runnable public void run() // Zawartość metody run 2. Utworzyć obiekt tej nowej klasy Rklasa r = new RKlasa(); 3. Utworzyć obiekt klasy Thread przekazując obiekt wcześniej utworzonej klasy jako parametr konstruktora klasy Thread. Thread t = new Thread(r); 4. Uruchomić watek wykonując metodę start() klasy Thread. t.start(); Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr / 37 Tworzenie wątku implement. interfejsu Runable class NowyWatek implements Runnable public void run() System.out.println(" Nowy watek : POCZATEK"); try for(int i = 5; i > ; i--) System.out.println(" Nowy watek: " + i); Thread.sleep(5); catch (InterruptedException e) System.out.println(" Nowy watek : KONIEC"); class GlownyWatek public static void main(string args[]) System.out.println(" Glowny watek: POCZATEK"); System.out.println(" Glowny watek: Tworze Nowy watek"); NowyWatek nowywatek = new NowyWatek(); Thread thread = new Thread(nowyWatek); System.out.println(" Glowny watek: Uruchamiam Nowy watek"); thread.start(); try for(int i = 5; i > ; i--) System.out.println(" Glowny watek: " + i); Thread.sleep(); catch (InterruptedException e) System.out.println(" Glowny watek: KONIEC"); działanie tworzenie uruchomienie działanie głównego watka Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 2 / 37

Kończenie pracy wątku Wątek kończy pracę w sposób naturalny gdy zakończy się jego metoda run(). Wykonanie metody stop() powoduje zatrzymanie innego wątku. Gdy zatrzymywany wątek znajduje się wewnątrz monitora to wejście do tego monitora zostaje odblokowane. Metoda ta jest wycofana (istnieje ale uŝycie jej nie jest zalecane). Powodem jest fakt Ŝe wywołując te metodę nie wiemy w jakim stanie jest zatrzymywany wątek. Gdy wykonuje jakieś krytyczne operacje moŝe pozostawić obiekt w nieprawidłowym stanie. Jeśli chcemy programowo zakończyć pracę wątku, powinniśmy zapewnić w metodzie run() sprawdzanie warunku zakończenia (ustalanego programowo) i jeśli warunek ten jest spełniony, spowodować wyjście z metody run(). Warunek zakończenia moŝe być formułowany w postaci jakiejś zmiennej, która jest ustalana przez inne fragmenty kodu programu (wykonywane w innym wątku). Kończenie pracy wątku - przykład class NowyWatek extends Thread boolean zakoncz = false; public void run() System.out.println(" Nowy watek : POCZATEK"); while (zakoncz==false) try sleep(2); catch (InterruptedException e) System.out.print("."); System.out.println("\n Nowy watek : KONIEC"); class GlownyWatek public static void main(string args[]) System.out.println(" Glowny watek: POCZATEK"); System.out.println(" Glowny watek: Tworze Nowy watek"); NowyWatek nowywatek = new NowyWatek(); nowywatek.start(); try Thread.sleep(); catch (InterruptedException e) nowywatek.zakoncz = true; try Thread.sleep(2); catch (InterruptedException e) System.out.println(" Glowny watek: KONIEC"); testowanie warunku zakończenia watka wymuszenie warunku zakończenia watka Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 3 / 37 Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 4 / 37 Kończenie pracy wątku - przykład Stany wątków Wątek moŝe znajdować się w jednym z czterech stanów: utworzony (ang. new thread) - obiekt wątku został juŝ utworzony ale nie wykonano metody start(), a więc wątek nie jest jeszcze szeregowany, wykonywalny (ang. runnable) - Wątek posiada wszystkie zasoby aby być wykonywany. Będzie wykonywany gdy tylko procedura szeregująca przydzieli mu procesor, zablokowany (ang. blocked) -Wątek nie moŝe być wykonywany gdyŝ brakuje mu pewnych zasobów. Dotyczy to w szczególności operacji synchronizacyjnych (wątek zablokowany na wejściu do monitora, operacje wait, sleep, join) i operacji wejścia wyjścia, zakończony (ang. dead) - Stan po wykonaniu metody stop(). Zalecanym sposobem kończenia wątku jest zakończeni metody run(). Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 5 / 37 Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 6 / 37

Stany wątków Stany wątków Przejście od stanu wykonywalny do zablokowany następuje gdy:. wątek chce wejść do zablokowanego monitora 2. wykonana została metoda wait(), join(), suspend() 3. wywołano metodę sleep(...) 4. wątek wykonał operację wejścia / wyjścia. Powrót od stanu zablokowany do wykonywany następuje gdy:. monitor został odblokowany 2. inny wątek wykonał operacja odblokowania zablokowanego wątku wywołał metodę notify(), notifyall(), resume(), interrupt() 3. gdy wątek zakończył wykonywanie metody sleep() upłynął zadany interwał czasu. 4. jeŝeli wątek czekał na zakończenie operacji wejścia / wyjścia operacja ta się zakończyła Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 7 / 37 Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 8 / 37 Synchronizacja wątków - przykład Pytanie: Synchronizacja wątków przykład c.d. Zmiany wartości zmiennej number gdy wykonywany jest tylko jeden wątek: Jaką wartość zwróci metoda balance()? class Balance private int number = ; public int balance() number++; Wartości zmiennej number wykonywane instrukcje w wątku balance() number++; zwróci wartość Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 9 / 37 Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 2 / 37

Synchronizacja wątków przykład c.d. Zmiany wartości zmiennej number gdy wykonywane są dwa wątki: Wartości zmiennej wykonywane instrukcje number w pierwszym wątku balance() number++; wykonywane instrukcje w drugim wątku Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 2 / 37 balance() number++; zwróci wartość wywłaszczenie pierwszego wątka zwróci wartość Synchronizacja wątków przykład c.d. Zmiany wartości zmiennej number gdy wykonywane są dwa wątki: Wartości zmiennej wykonywane instrukcje number w pierwszym wątku balance() number++; 2 wykonywane instrukcje w drugim wątku Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 22 / 37 balance() number++; wywłaszczenie pierwszego wątka zwróci wartość wywłaszczenie drugiego wątka zwróci wartość Synchronizacja wątków przykład c.d. Zawsze musimy się liczyć z tym, Ŝe wątki operujące na współdzielonych zmiennych mogą być wywłaszczone w trakcie operacji (nawet pojedynczej) i wobec tego stan współdzielonej zmiennej moŝe okazać się niespójny. Testowanie programów wielowątkowych jest trudne, bowiem moŝemy wiele razy otrzymać wyniki, które wydają się świadczyć o poprawności programu, a przy kolejnym uruchomieniu okaŝe się, Ŝe wynik jest nieprawidłowy. Wyniki uruchamiania programów wielowątkowych mogą być takŝe róŝne na róŝnych platformach systemowych. Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 23 / 37 Synchronizacja wątków Komunikacja między wątkami opiera się na wspólnej pamięci. W takim przypadku występuje zjawisko wyścigów. Wyścigi (ang. race conditions) wynik działania procedur wykonywanych przez wątki zaleŝy od kolejności ich wykonania. Gdy kilka wątków ma dostęp do wspólnych danych i przynajmniej jeden je modyfikuje występuje konieczność synchronizowania dostępu do wspólnych danych. Synchronizacja jest mechanizmem, który zapewnia, Ŝe kilka wykonujących się wątków: nie będzie równocześnie działać na tym samym obiekcie, nie będzie równocześnie wykonywać tego samego kodu. Kod, który moŝe być wykonywany w danym momencie tylko przez jeden wątek, nazywa się sekcją krytyczną. W Javie sekcje krytyczne wprowadza się jako bloki lub metody synchronizowane. Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 24 / 37

Synchronizacja wątków - monitory KaŜdy egzemplarz klasy Object i jej podklas posiada monitor (ang. lock), który ogranicza dostęp do obiektu. Blokowanie obiektów jest sterowane słowem kluczowym synchronized. Synchronizacja w Javie moŝe być wykonana na poziomie: metod słowo kluczowe synchronized występuje przy definiowaniu metody: public synchronized int balance()... instrukcji - słowo kluczowe synchronized występuje przy definiowaniu bloku instrukcji: synchronized( number ) number++; Synchronizacja wątków Kiedy wątek wywołuje na rzecz jakiegoś obiektu metodę synchronizowaną, automatycznie zamykany jest monitor (obiekt jest zajmowany przez wątek). Inne wątki usiłujące wywołać na rzecz tego obiektu metodę synchronizowaną (niekoniecznie tą samą) lub usiłujące wykonać instrukcję synchronized z podaną referencją do zajętego obiektu są blokowane i czekają na zakończenie wykonywania metody lub instrukcji synchronized przez wątek, który zajął obiekt (zamknął monitor). Dowole zakończenie wykonywania metody synchronizowanej lub instrukcji synchronized zwalnia monitor, dając czekającym wątkom moŝliwość dostępu do obiektu. Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 25 / 37 Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 26 / 37 Koordynacja wątków Koordynacja wątków polega na zapewnieniu właściwej kolejności działań wykonywanych przez róŝne wątki na wspólnym zasobie. Do koordynacji wątków stosuje się następujące metody: wait(), notify(), notifyall(). Metoda wait() public final void wait(); public final void wait(long timeout); public final void wait(long timeout,int nanos) throws InterruptedException Wykonanie metody powoduje zawieszenie bieŝącego wątku do czasu gdy inny watek nie wykona metody notify() lub notifyall() odnoszącej się do wątku, który wykonał wait(). Wątek wykonujący wait(...) musi być w posiadaniu monitora dotyczącego synchronizowanego obiektu. Wykonanie wait(...) powoduje zwolnienie monitora. Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 27 / 37 Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 28 / 37

Metoda notify() public final void notify(); Metoda powoduje odblokowanie jednego z wątków zablokowanych na monitorze pewnego obiektu poprzez wait(). Który z czekających wątków będzie odblokowany nie jest w definicji metody określone. Metoda notifyall() public final void notifyall() Metoda powoduje odblokowanie wszystkich wątków zablokowanych na monitorze pewnego obiektu poprzez uprzednie wykonanie wait(). Wątki będą jednak czekały aŝ wątek bieŝący nie zwolni blokady monitora. Odblokowane wątki będą konkurowały o nabycie blokady monitora. Odblokowany wątek nie będzie natychmiast wykonywany musi on jeszcze zaczekać aŝ zwolniona będzie przez bieŝący wątek blokada monitora. Odblokowany wątek będzie konkurował z innymi o nabycie blokady monitora. Metoda moŝe być wykonana tylko przez wątek, który jest właścicielem zajmuje monitor obiektu. Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 29 / 37 Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 3 / 37 Przykład koordynacji: Problem producent - konsument. Przykład koordynacji: Problem producent - konsument. Ograniczenia:. Z bufora moŝe korzystać w jedej chwili tylko jeden producent lub konsument, 2. Producent moŝe umieścić liczbę w buforze tylko wówczas, gdy bufor jest pusty. W przeciwnym wypadku Producent musi czekać, aŝ konsument zwolni miejsce w buforze. 3. Konsument moŝe pobrać liczbę z bufra tylko wtedy, gdy bufor nie jest pusty. W przeciwnym wypadku konsument musi czekać ąŝ jakiś producent umieści w buforze liczbę. Kilku producentów i konsumentów korzysta ze wspólnego zasobu jakim jest bufor. KaŜdy producent co pewien czas generuje liczby i umieszcza je w buforze. KaŜdy konsument co pewien czas pobiera liczbę z bufora i wyświetla ją na ekranie. Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 3 / 37 Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 32 / 37

Klasa Producent public class Producent extends Thread private Bufor buf; private int number; public Producent(Bufor c, int number) buf = c; this.number = number; public void run() for (int i = ; i < ; i++) buf.put(i); System.out.println("Producent #" + this.number + " put: " + i); try sleep((int)(math.random() * )); catch (InterruptedException e) Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 33 / 37 Klasa Konsument public class Konsument extends Thread private Bufor buf; private int number; public Konsument(Bufor c, int number) buf = c; this.number = number; public void run() int value = ; for (int i = ; i < ; i++) value = buf.get(); System.out.println("Konsument #" + this.number + " got: " + value); Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 34 / 37 Klasa ProducentKonsumentTest public class ProducentConsumentTest public static void main(string[] args) Bufor c = new Bufor(); Producent p = new Producent(c, ); Konsument c = new Konsument(c, ); p.start(); c.start(); Klasa Bufor metoda get() public class Bufor private int contents; private boolean available = false; public synchronized int get() while (available == false) try wait(); catch (InterruptedException e) available = false; notifyall(); return contents; Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 35 / 37 Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 36 / 37

Klasa Bufor metoda put() public synchronized void put(int value) while (available == true) try wait(); catch (InterruptedException e) contents = value; available = true; notifyall(); Języka Java wątki Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 37 / 37