Współbieżność w Javie

Podobne dokumenty
Współbieżność w Javie

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

Współbieżność w Javie. Dariusz Wawrzyniak 1. Dziedziczenie z klasy Thread definicja klasy pochodnej od Thread,

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

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

Język Java wątki (streszczenie)

Kurs programowania. Wykład 8. Wojciech Macyna

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

Wątki w Javie. Piotr Tokarski

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

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

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

Język Java wątki (streszczenie)

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

Programowanie komputerów

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

Programowanie wielowątkowe. Tomasz Borzyszkowski

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

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

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

Podstawy współbieżności

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

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

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

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

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

Równolegªo± w Javie w tki.

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

Programowanie współbieżne Laboratorium nr 11

Wywoływanie metod zdalnych

Java. Programowanie Obiektowe Mateusz Cicheński

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

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

Programowanie współbieżne Wykład 10 Synchronizacja dostępu do współdzielonych zasobów. Iwona Kochańska

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

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

Java: interfejsy i klasy wewnętrzne

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie współbieżne i rozproszone

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

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Multimedia JAVA. Historia

Podejście obiektowe do budowy systemów rozproszonych

Mechanizmy pracy równoległej. Jarosław Kuchta

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

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

Wywoływanie metod zdalnych

Podejście obiektowe do budowy systemów rozproszonych

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

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Remote Method Invocation 17 listopada 2010

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

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

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

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

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

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

Platformy Programistyczne Podstawy języka Java

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

1 Atrybuty i metody klasowe

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

Programowanie obiektowe

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

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

Monitory. Jarosław Kuchta

Wykład 6: Dziedziczenie

Systemy operacyjne. Zajęcia 11. Monitory

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

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

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

PHP 5 język obiektowy

Systemy Rozproszone - Ćwiczenie 4

Programowanie współbieżne i rozproszone w języku Java

Dokumentacja do API Javy.

procesów Współbieżność i synchronizacja procesów Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

Enkapsulacja, dziedziczenie, polimorfizm

Zaawansowany kurs języka Python

Generatory. Michał R. Przybyłek

Programowanie współbieżne Laboratorium nr 12

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Aplikacje RMI Lab4

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

Model pamięci. Rafał Skinderowicz

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

Aplikacje RMI

KLASY, INTERFEJSY, ITP

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

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

Kurs WWW. Paweł Rajba.

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

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

Programowanie obiektowe

Programowanie obiektowe

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

Programowanie obiektowe

Programowanie obiektowe

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie obiektowe

Transkrypt:

Wielowątkowość (obsługa wątków) Tworzenie wątków Stany wątków i ich zmiana Demony Grupy wątków Synchronizacja wątków wzajemne wykluczanie oczekiwanie na zmiennych warunkowych pakiet java.util.concurrent 2 Wątek reprezentowany jest w procesie na JVM przez obiekt klasy Thread (w szczególności jej pochodnej). Programem głównym wątku jest metoda run() klasy wywiedzionej z Thread lub dowolnej klasy implementującej interfejs Runnable. Dziedziczenie z klasy Thread definicja klasy pochodnej od Thread, utworzenie obiektu zdefiniowanej klasy. Implementacja interfejsu Runnable definicja klasy implementującej interfejs Runnable, utworzenie obiektu zdefiniowanej klasy, utworzenie obiektu klasy Thread z przekazaniem referencji do utworzonego obiektu klasy implementującej Runnable. 3 4 Zdefiniowanie klasy MThread wywiedzionej z klasy Thread (implementacja w tej klasie metody run(), która zawiera program wątku) class MThread extends Thread void run() Utworzenie obiektu th zdefiniowanej klasy MThread MThread th; th = new MThread(); Zdefiniowanie klasy MClass implementującej Runnable oraz implementacja w tej klasie metody run(), która zawiera program wątku class MClass implements Runnable void run() Utworzenie obiektu obj zdefiniowanej klasy MClass MClass obj = new MClass(); Utworzenie obiektu th klasy Thread Thread th = new Thread(obj); 5 6 Dariusz Wawrzyniak 1

public interface Runnable public abstract void run(); private Runnable target; public void run() if (target!= null) target.run(); Referencja target ustawiana jest w konstruktorze, jeśli zostanie przekazany parametr klasy implementującej Runnable. 7 8 Thread(); Thread(Runnable target); Thread(String name); Thread(Runnable target, String name); wywołanie metody start() exiting wywołanie metody stop() lub zakończenie metody run() initial runnable runnable suspended uśpienie jawne lub w wyniku synchron. obudzenie lub przerw. uśpienia blocked blocked suspended wznowienie metoda resume() zawieszenie metoda suspend() 9 10 void start() uruchomieniewątku, void stop() zakończenie działania wątku, void run() metoda wykonywana przez wątek (główny program wątku), void suspend() zawieszenie wąteku (wątek nie zwalnia blokad), void resume() wznawienie wykonywania zawieszonego wątku, void interrupt() przerwanie oczekiwanie wątku w stanie zablokowania. static void sleep(long milsec [, int nanosec]) uśpienie wątku na podany okres czasu, static void yield() oddanie procesora innemu wątkowi o tym samym priorytecie. Zmiana stanu następuje w wątku wywołującym (wątek wywołuje te metody w celu zmiany własnego stanu) 11 12 Dariusz Wawrzyniak 2

Przerwanie wywołanie metody interrupt() na obiekcie wątku przerywa oczekiwanie wątku w (np. sleep, join, wait) poprzez zgłoszenie wyjątku InterruptedException. Jeśli wątek nie jest w stanie blocked, fakt przerwania jest odnotowywany poprzez ustawienie odpowiedniej flagi (interrupted status). Metoda statyczna Thread.interrupted() zwraca true jeśli flaga jest ustawiona (dla bieżącego wątku) i ją kasuje. Metoda isinterrupted() (na obiekcie wątku) zwraca tę informację dla danego wątku, ale nie kasuje flagi. void setname(string name) przypisanie nazwy do wątku, String getname() odczytanie przypisanej nazwy. Z punktu widzenie systemu nazewnictwo wątków nie ma żadnego znaczenia, jest również raczej mało istotne dla użytkownika. 13 14 void setpriority(int priority) ustawianie priorytetu wątku, int getpriority() odczytanie priorytetu wątku. Stałe (final) w klasie Thread: Thread.MIN_PIORITY Thread.MAX_PIORITY Thread.NORM_PIORITY Większa wartość oznacza wyższy priorytet. void join([long milsec [, int nanosec]]) oczekiwanie na zakończenie wątku (można podać czas oczekiwania), boolean isalive() sprawdzenie, czy wątek działa (zwraca true jeśli wątek został uruchomiony przez start(), ale nie zakończył jeszcze działania wykonywanie metody run() nie dobiegło końca). 15 16 static Thread currentthread() zwraca obiekt reprezentujący aktualnie wykonywany wątek, static int enumerate(thread threadarray[]) zwraca obiekty reprezentujące wszystkie wątki procesu, static int activecount() zwraca liczbę aktywnych wątków procesu. Demon jest takim wątkiem, który kończy swoje działanie po zakończeniu ostatniego wątku użytkownika. void setdaemon(boolean on) w zależności od wartości parametru on zmienia wątek użytkownika na wątek demon lub odwrotnie, boolean isdaemon() sprawdza, czy wątek jest demonem. 17 18 Dariusz Wawrzyniak 3

Łączenie wątków w grupy ma na celu ułatwienie zarządzania zbiorami logicznie powiązanych ze sobą wątków (np. grupa wątków w serwerze do obsługi określonego klienta na połączeniu siec.) Wątek musi zostać przypisany do grupy w momencie tworzenia i pozostaje w niej do końca swego istnienia. Grupy tworzą hierarchię wynikającą z zawierania się jednych grup w innych (każda nowo tworzona grupa jest częścią innej grupy). Thread(ThreadGroup group, Runnable target); Thread(ThreadGroup group, String name); Thread(ThreadGroup group, Runnable target, String name); 19 20 Grupa wątków reprezentowana jest przez obiekt klasy ThreadGroup. Konstruktory klasy ThreadGroup: ThreadGroup(String name) utworzenie nowej grupy, która jest podgrupą grupy wątku bieżącego, ThreadGroup(ThreadGroup parent, String name) utworzenie nowej grupy, która jest podgrupą grupy wskazanej. void stop() zakończenie działania wszystkich wątków w grupie, void suspend() zawieszenie wszystkich wątków w grupie, void resume() wznawianie wykonywania zawieszonych wszystkich wątków w grupie. 21 22 int enumerate(thread list[]) int enumerate(thread list[], boolean recurse) int activecount() int enumerate(threadgroup list[]) int enumerate(threadgroup list[], boolean recurse) Do usuwania grupy wątków służy metoda destroy(). Metoda destroy() jest skuteczna, jeśli wszystkie wątki w grupie i podgrupach zostały zakończone. Metoda destroy() rekurencyjnie usuwa również wszystkie podgrupy grupy usuwanej. 23 24 Dariusz Wawrzyniak 4

Koordynacja wątków, spójność danych Synchronizacja procesów/wątków koordynacja realizacji poszczególnych instrukcji (kroków, faz) kontrola przepływu sterowania Synchronizacja danych utrzymanie spójności danych gwarancja dostępu do najświeższych wartości zmiennych/stanów obiektów (uwzględnienie wyników ostatnich modyfikacji) 26 Poziom architektury systemu komputorowego zapis/odczyt współdzielonych zmiennych (tzw. współdzielone rejestry) złożone operacje realizowane niepodzielnie, np. test&set, exchange Poziom systemu operacyjnego zarządzanie procesami/wątkami (ich stanem), integracja z mechanizmami przydziału procesora (szeregowania), np. semafory, zamki, zmienne warunkowe Poziom języka programowania strukturalne mechanizmy synchronizacji udostępniające konstrukcje do wyrażania zależności i ograniczeń w dostępie do współdzielonych zasobów (monitory, regiony krytyczne) Mechanizmy niskopoziomowe Wzajemne wykluczanie blok/metoda Oczekiwanie na spełnienie warunku wait(), notify(), notifyall() Blok oraz metody wait(), notify() i notifyall() mogą być realizowane na dowolnym obiekcie (obiekcie klasy Object). Mechanizmy wysokopoziomowe pakiet java.util.concurrent (od wersji 1.5) Atomowe operacja na obiektach Zamki (Lock) i zmienne warunkowe (Condition) Semafory (Semaphore), bariery (CyclicBarrier) itp. Współbieżnie dostępne kolekcje (ConcurrentHashMap, ConcurrentLinkedQueue, CopyOnWriteArrayList, CopyOnWriteArraySet) 28 Blok na danym obiekcie zajmuje zamek związany (integralnie) z tym obiektem (obj) Metoda typu zajmuje zamek związany z obiektem, dla którego jest wywoływana, będzie zatem wykluczać wykonanie innych metod typu lub bloków na tym obiekcie. 29 public class Konto private float kwota; public boolean wyplata(float k) if (k <= kwota) kwota -= k; return true; return false; public void wplata (float k) kwota += k; 30 Dariusz Wawrzyniak 5

Jeśli tylko fragment kodu metody ma się wykluczać z innymi metodami typu, można to osiągnąć przez utworzenie bloku na referencji this w implementacji tej metody. (this) Co się stanie, jeśli metoda typu zostanie wywołana z innej metody typu (czyli przez ten sam wątek)? Czy nastąpi zakleszczenie, a jeśli nie, to czy nie nastąpi przedwczesne zwolnienie blokady obiektu? 31 32 method_a() method_b(); zamek zintegrowany z obiektem jest wielowejściowy ponowne założenie zamka na tym samym obiekcie zakleszczenie? method_b() przedwczesne zwolnienie zamka? obiekt a wątek A method() b.method(); method() a.method(); obiekt b (ang. reentrant) 33 34 zajęty zamek zajęty zamek ZAKLESZCZENIE!!! wątek B void wait([long milsec [, int nanosec]]) czeka na spełnienie warunku (na sygnał wysyłany przez notify() lub notifyall()), void notify() wysyła sygnał do wątku oczekującego po wywołaniu metody wait() danego obiektu, void notifyall() wysyła sygnał do wszystkich wątków oczekujących po wywołaniu metody wait(), Metody wait(), notify() i notifyall() muszą być wywoływane w bloku (metodzie) na tym samym obiekcie, w przeciwnym przypadku zgłaszany jest wyjątek NotOwnerException. wątek A sygnał ignorowany (obj) sygnał budzący (obj) obj.notify(); (obj) obj.notify(); 35 36 obj.wait(); wątek B Dariusz Wawrzyniak 6

wątek A wątek B Czy przy pomocy mechanizmów synchronizacji w Java ie da się zbudować monitor? czy warunek spełniony? wait() zmiana stanu (modyfikacja zmiennych/ obiektów) notify() 37 38 Atomowe zmienne: AtomicBoolean, AtomicInteger, AtomicLong, AtomicReference Operacje (atomowe) na zmiennej atomowej: addandget, getandadd, compareandset, decrementandget, getanddecrement, incrementandget, getandincrement 39 Dariusz Wawrzyniak 7