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

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

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

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

Język Java wątki (streszczenie)

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

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

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

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

Java. Programowanie Obiektowe Mateusz Cicheński

Programowanie współbieżne Laboratorium nr 11

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

Wywoływanie metod zdalnych

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

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

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

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 współbieżne Wykład 2. Rafał Skinderowicz

Java: interfejsy i klasy wewnętrzne

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie współbieżne i rozproszone

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

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

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

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

Wywoływanie metod zdalnych

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

Podejście obiektowe do budowy systemów rozproszonych

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

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

Programowanie obiektowe

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Remote Method Invocation 17 listopada 2010

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

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

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

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

Monitory. Jarosław Kuchta

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

Systemy Rozproszone - Ćwiczenie 4

Platformy Programistyczne Podstawy języka Java

1 Atrybuty i metody klasowe

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

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

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

Generatory. Michał R. Przybyłek

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

Wykład 6: Dziedziczenie

Programowanie współbieżne Laboratorium nr 12

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

Systemy operacyjne. Zajęcia 11. Monitory

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

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

Model pamięci. Rafał Skinderowicz

PHP 5 język obiektowy

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

Dokumentacja do API Javy.

Enkapsulacja, dziedziczenie, polimorfizm

Zaawansowany kurs języka Python

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

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

Aplikacje RMI Lab4

Programowanie obiektowe

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Aplikacje RMI

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

KLASY, INTERFEJSY, ITP

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

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.

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

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

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

Programowanie obiektowe

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 Dariusz Wawrzyniak 1

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. 3 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. 4 Dariusz Wawrzyniak 2

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(); 5 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); 6 Dariusz Wawrzyniak 3

public interface Runnable { public abstract void run(); 7 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. 8 Dariusz Wawrzyniak 4

Thread(); Thread(Runnable target); Thread(String name); Thread(Runnable target, String name); 9 wywołanie metody start() initial uśpienie jawne lub w wyniku synchron. obudzenie lub przerw. uśpienia exiting wywołanie metody stop() lub zakończenie metody run() runnable runnable suspended blocked blocked suspended wznowienie metoda resume() zawieszenie metoda suspend() 10 Dariusz Wawrzyniak 5

void start() uruchomienie wą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. 11 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) 12 Dariusz Wawrzyniak 6

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. 13 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. 14 Dariusz Wawrzyniak 7

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. 15 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). 16 Dariusz Wawrzyniak 8

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. 17 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. 18 Dariusz Wawrzyniak 9

Łą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). 19 Thread(ThreadGroup group, Runnable target); Thread(ThreadGroup group, String name); Thread(ThreadGroup group, Runnable target, String name); 20 Dariusz Wawrzyniak 10

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. 21 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. 22 Dariusz Wawrzyniak 11

int enumerate(thread list[]) int enumerate(thread list[], boolean recurse) int activecount() int enumerate(threadgroup list[]) int enumerate(threadgroup list[], boolean recurse) 23 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. 24 Dariusz Wawrzyniak 12

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 Dariusz Wawrzyniak 13

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 synchronized Oczekiwanie na spełnienie warunku wait(), notify(), notifyall() Blok synchronized 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 Dariusz Wawrzyniak 14

Blok synchronized na danym obiekcie zajmuje zamek związany (integralnie) z tym obiektem synchronized (obj){... Metoda typu synchronized zajmuje zamek związany z obiektem, dla którego jest wywoływana, będzie zatem wykluczać wykonanie innych metod typu synchronized lub bloków synchronized na tym obiekcie. 29 public class Konto { private float kwota; public synchronized boolean wyplata(float k) { if (k <= kwota) { kwota -= k; return true; return false; public synchronized void wplata (float k) { kwota += k; 30 Dariusz Wawrzyniak 15

Jeśli tylko fragment kodu metody ma się wykluczać z innymi metodami typu synchronized, można to osiągnąć przez utworzenie bloku synchronized na referencji this w implementacji tej metody. {... synchronized (this) {... 31 Co się stanie, jeśli metoda typu synchronized zostanie wywołana z innej metody typu synchronized (czyli przez ten sam wątek)? Czy nastąpi zakleszczenie, a jeśli nie, to czy nie nastąpi przedwczesne zwolnienie blokady obiektu? 32 Dariusz Wawrzyniak 16

synchronized method_a() { method_b(); ponowne założenie zamka na tym samym obiekcie zakleszczenie? synchronized method_b() { zamek zintegrowany z obiektem jest wielowejściowy (ang. reentrant) przedwczesne zwolnienie zamka? 33 wątek A wątek B obiekt a zajęty zamek zajęty zamek obiekt b synchronized method() { b.method(); ZAKLESZCZENIE!!! synchronized method() { a.method(); 34 Dariusz Wawrzyniak 17

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) synchronized na tym samym obiekcie, w przeciwnym przypadku zgłaszany jest wyjątek NotOwnerException. 35 wątek A sygnał ignorowany synchronized(obj){ wątek B synchronized(obj) { obj.notify(); obj.wait(); sygnał budzący synchronized(obj) { obj.notify(); 36 Dariusz Wawrzyniak 18

wątek A wątek B synchronized czy warunek spełniony? wait() zmiana stanu (modyfikacja zmiennych/ obiektów) notify() synchronized 37 Czy przy pomocy mechanizmów synchronizacji w Java ie da się zbudować monitor? 38 Dariusz Wawrzyniak 19

Atomowe zmienne: AtomicBoolean, AtomicInteger, AtomicLong, AtomicReference Operacje (atomowe) na zmiennej atomowej: addandget, getandadd, compareandset, decrementandget, getanddecrement, incrementandget, getandincrement 39 Dariusz Wawrzyniak 20