Model współbieżności w Javie autor: Grzegorz Szuba.

Slides:



Advertisements
Podobne prezentacje
Funkcje w PHP ABK.
Advertisements

Wstęp do strumieni danych
C++ wykład 2 ( ) Klasy i obiekty.
C++ wykład 4 ( ) Przeciążanie operatorów.
Podstawowe pojęcia programowania współbieżnego
Java dla studentów II roku Wydziału Fizyki PW Przemysław Duda, 2012
Jarosław Kuchta Monitory.
Programowanie obiektowe
Programowanie obiektowe
Programowanie obiektowe
Wzorce.
Tworzenie i obsługa programów – przykład 3 uwagi cd. Wykorzystując różne klasy biblioteki języka Java należy pamiętać w jakim pakiecie się znajdują. Wszystkie.
Nguyen Hung Son Uniwersytet Warszawski
Programowanie obiektowe w Javie
RMI I RMI-IIOP Wprowadzenie Co to jest RMI?
ODE Triggery. Wstęp n Triggery są trójką zdarzenie-warunek-akcja (event-condition- action). n Zdarzenia mogą być proste lub złożone, co zostanie omówione.
ODE Informacje wstępne. Pojęcia podstawowe n Obiektowa baza danych u język komunikacji u ziarnistość obiektów u identyfikacja obiektów n Transakcja -
Programowanie wielowątkowe
Multimedia Obrazy i dźwięki w apletach Javy, praca z tekstem, zdarzenia od myszki, obsługa wyjątków w Javie, aplety z wątkami, animacja poklatkowa.
Programowanie sieciowe w Javie
Gniazda komunikacji sieciowej w języku Java
Plan Prezentacji Wczytywanie grafiki Wyświetlanie obrazów

ZARZĄDZANIE PROCESAMI
Język Java Wielowątkowość.
Muteksy Muteksy (mutex – MUTual EXclusion) są prostymi obiektami synchronizacyjnymi pełniącymi rolę semaforów binarnych dla wątków (chroniącymi sekcje.
Semafory według normy POSIX
Wątki.
Serializacja Serializacja pozwala zamienić obiekt na sekwencję bajtów, w sposób umożliwiający później wierne odtworzenie jego zawartości Inna nazwa to.
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
Programowanie urządzeń mobilnych – wykład IV
Java 3 MPDI Programowanie obiektowe W7. import java.io.*; public class X { // kontrukcja throws – określenie jakie wyjątki może dana metoda // sygnalizować
Tworzenie aplikacji mobilnych
Automatyka i Robotyka Systemy czasu rzeczywistego Wykład 4.
Programowanie obiektowe – zastosowanie języka Java SE
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Andrzej Repak Nr albumu
Java – coś na temat Klas Piotr Rosik
Inicjalizacja i sprzątanie
Seminarium problemowe
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Problem sekcji krytycznej
Przekazywanie parametrów do funkcji oraz zmienne globalne i lokalne
Programowanie obiektowe 2013/2014
Prasek Aneta, Skiba Katarzyna. Funkcje stałe const to takie funkcje, które nie mogą modyfikować stanu obiektu. Oznacza to, że funkcja stała nie może zmieniać.
W ą t e k (lekki proces) thread.
Bariery synchronizacyjne Bariery są obiektami synchronizacyjnymi pakietu pthread służącymi do wyrównywania czasów pracy wątków wykonujących wspólne zadanie.
Kurs języka C++ – wykład 4 ( )
Procesy, wątki Program a proces Proces: Przestrzeń adresowa, kod, dane, stos (część pamięci do przechowania zmiennych lokalnych i niektórych adresów) Otwarte.
Model współbieżności w Javie
Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej Programowanie wielowątkowe w Javie Wykład 9 mgr inż. Michał Misiak.
Paweł Starzyk Obiektowe metody projektowania systemów
Programowanie sieciowe w Javie Michał Kuciapski
Programowanie Zaawansowane
Podstawy informatyki Mechanizm obsługi sytuacji wyjątkowych Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu.
Programowanie Obiektowe – Wykład 6
Wątki, programowanie współbieżne
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
(według:
(c) Krzysztof Barteczko 2014
Delegaty Delegat to obiekt „wiedzący”, jak wywołać metodę.
Programowanie Obiektowe – Wykład 2
Klasy wewnętrzne. Praktyka użycia interfejsów i klas wewnętrznych
Programowanie obiektowe – zastosowanie języka Java SE
PGO Interfejsy Michail Mokkas.
BYDGOSKI FESTIWAL NAUKI
Programowanie w Javie 1 Dr Robert Kowalczyk
Tworzenie wątków w Javie
Zapis prezentacji:

Model współbieżności w Javie autor: Grzegorz Szuba

Współbieżność - a co to takiego? Współbieżność to jednoczesne wykonywanie współpracujących i komunikujących się ze sobą wątków W komputerach jednoprocesorowych współbieżność jest emulowana, w danym momencie wykonywany jest tylko jeden wątek

Różnice między wątkiem a procesem Każdy wątek posiada własny wirtualny procesor Wątki korzystają z tego samego egzemplarza kodu wykonywalnego Wątki korzystają z tych samych danych

Jak stworzyć nowy wątek? Dziedzicząc po klasie Thread Implementując interfejs Runnable

Dziedziczenie po klasie Thread public class MyThread extends Thread { public void run() { System.out.println(”Hello world”); } Thread nowy = new MyThread(); nowy.start();

Dziedziczenie po klasie Thread Należy pamiętać, że w Javie można dziedziczyć tylko po jednej klasie Jeśli potrzebujemy dziedziczyć po innej klasie, możemy zaimplementować interfejs Runnable

Implementacja interfejsu Runnable public class myLabel extends Label implements Runnable { public void run(){ setText(”Hello world”); } myLabel nowy = new MyLabel(); Thread nowywatek = new Thread(nowy); nowywatek.start();

Stany wątków nowy uruchamialny zablokowany uśmiercony

Stany wątków - nowy Obiekt wątku już istnieje, ale jeszcze się nie wykonuje Aby rozpocząć wykonywanie, należy wywołać funkcję start() public void start() throws IllegalThreadStateException wyjątek zostanie rzucony, gdy na rzecz danego obiektu wywoływano już metodę start()

Stany wątków - uruchamialny Wątek jest uruchomiony – wywołano już na jego rzecz metodę start() i jeśli właśnie nie działa, to tylko dlatego, że oczekuje na przydział zasobów

Stany wątków - zablokowany Do sterowania wykonywaniem wątków możemy użyć następujących instrukcji: sleep() wait() notify(), notifyAll() join() yield()

Metoda sleep() public static void sleep(long millis) throws InterruptedException public static void sleep(long millis,int nans) throws InterruptedException Nie jest zwalniana blokada obiektu Wyjątek zostanie rzucony, gdy inny wątek wywoła metodę interrupt() na rzecz tego wątku

Metoda interrupt() public void interrupt() Przerywa zawieszenie wątku metodami sleep, wait i join na rzecz którego jest wywołana Przerwany wątek otrzyma wyjątek InterruptedException

Metoda join() Wywołując metodę join() innego wątku, zawieszamy wątek aż do zakończenia wykonania wątku, którego metodę wywołaliśmy Jeśli podamy argument czasowy, wątek będzie czekał tylko przez określony czas

Metoda join() public final void join() throws InterruptedException public final void join(long millis) throws InterruptedException public final void join(long millis, int nanos) throws InterruptedException Wyjątek zostanie rzucony, gdy inny wątek wywoła metodę interrupt() na rzecz tego wątku

Metoda yield() public static void yield() Przerywa wykonanie wątku aby umożliwić innym wątkom wykonywanie się Dotyczy to tylko wątków o takim samym lub większym priorytecie Wątek od razu znajduje się w stanie „uruchamialny” – w szczególności przy braku innych wątków może się natychmiast rozpocząć wykonywać

Metoda isAlive() public final boolean isAlive() Zwraca true jeśli wątek wykonuje swoje działanie, czyli czy wywołano już metodę start() a wątek jeszcze się nie zakończył, w przeciwnym przypadku zwraca false

Stany wątków - uśmiercony Zakończenie wykonania wątku następuje, gdy: metoda run() zakończy swoje działanie – jest to preferowana metoda wywołamy metodę destroy() (ale : nie zwolnimy blokad obiektów) wywołamy metodę stop() (niezalecana, ze względu na możliwość rzucenia nieobsługiwalnego wyjątku

Priorytety Jest to mechanizm wskazywania, który wątek jest ważniejszy i powinien być częściej wykonywany Nie mamy pewności co do kolejności wykonywania wątków Problemy z odwzorowaniem priorytetów w różnych systemach operacyjnych

Priorytety public final void setPriority(int newPriority) - ustawia nowy priorytet dla wątku public final int getPriority() - zwraca aktualną wartość priorytetu

Priorytety Stałe służące do określania wartości priorytetu : public static final int MIN_PRIORITY - minimalna wartość priorytetu public static final int NORM_PRIORITY - domyślna wartość priorytetu public static final int MAX_PRIORITY - maksymalna wartość priorytetu

import java.lang.Thread; public class NumberThread extends Thread { int myNumber; public NumberThread( int theNumber ) { myNumber = theNumber; } public void run() { System.out.println("I'm "+ myNumber + " in priority " + getPriority()); for(int i=0; i<25; i++) System.out.println( "My Number Is " + myNumber + " in round : " + i); } public class ThreadDemo { public static void main( String [] args ) { NumberThread t1 = new NumberThread(1); NumberThread t2 = new NumberThread(2); t2.setPriority(2); t2.start(); t1.setPriority(1); t1.start(); }

I'm 2 in priority 2 My Number Is 2 in round : 0 My Number Is 2 in round : 1 My Number Is 2 in round : 2 I'm 1 in priority 1 My Number Is 1 in round : 0 My Number Is 1 in round : 1 My Number Is 1 in round : 2 My Number Is 1 in round : 3 My Number Is 2 in round : 3 My Number Is 1 in round : 4 My Number Is 2 in round : 4 My Number Is 2 in round : 5 My Number Is 2 in round : 6 My Number Is 2 in round : 7 My Number Is 2 in round : 8 My Number Is 2 in round : 9 My Number Is 2 in round : 10 My Number Is 2 in round : 11 My Number Is 2 in round : 12 My Number Is 2 in round : 13 My Number Is 2 in round : 14 My Number Is 2 in round : 15 My Number Is 1 in round : 5 My Number Is 1 in round : 6 My Number Is 1 in round : 7 My Number Is 1 in round : 8 My Number Is 1 in round : 9 My Number Is 1 in round : 10 My Number Is 1 in round : 11 My Number Is 1 in round : 12 My Number Is 2 in round : 16 My Number Is 2 in round : 17 My Number Is 2 in round : 18 My Number Is 2 in round : 19 My Number Is 2 in round : 20 My Number Is 1 in round : 13 My Number Is 1 in round : 14 My Number Is 1 in round : 15 My Number Is 2 in round : 21 My Number Is 2 in round : 22 My Number Is 2 in round : 23 My Number Is 2 in round : 24 My Number Is 1 in round : 16 My Number Is 1 in round : 17 My Number Is 1 in round : 18 My Number Is 1 in round : 19 My Number Is 1 in round : 20 My Number Is 1 in round : 21 My Number Is 1 in round : 22 My Number Is 1 in round : 23 My Number Is 1 in round : 24

Wątki straszą po nocach, czyli Demony Demony to specjalne rodzaje wątków Ich celem jest działanie w ”tle” Wirtualna maszyna kończy pracę, gdy zakończą się wszystkie wątki nie będące demonami

Demony public final void setDaemon(boolean on) - aby wątek został demonem, należy wywołać tą metodę z parametrem ”true” - należy to zrobić przed wywołaniem na rzecz tego wątku metody start() public final boolean isDaemon() - sprawdza, czy dany wątek jest demonem

Synchronizacja wątków Aby lepiej zrozumieć czym jest synchronizacja, rozważmy program, którego zadaniem jest narysować linię wzdłuż przekątnej okna apletu

import java.applet.*; import java.awt.*; public class Master extends Applet implements Runnable{ Thread thread1, thread2; int [] tablicax; int [] tablicay; Graphics gdc; int wskaznik; public void init() { gdc = getGraphics(); thread1 = new Thread(this); thread2 = new Thread(this); thread1.start(); thread2.start(); tablicax = new int [100]; tablicay = new int [100]; } public void paint(Graphics gdc){ for(int i=0;i<=wskaznik;i++) gdc.fillRect(tablicax[i], tablicay[i],1,1); } public void run(){ for(int i=0;i<49;i++){ tablicax[wskaznik+1] = tablicax[wskaznik]+1; System.out.print( tablicax[wskaznik]+ " "); wskaznik++; System.out.print("-"); tablicay[wskaznik] = tablicay[wskaznik-1]+1; System.out.println(" " + tablicay[wskaznik-1] + " "+ wskaznik); repaint(); }

A oto wynik działania naszego programu :

Synchronizacja Aby uniknąć powyższej sytuacji, należy ograniczyć liczbę wątków mogących w danym momencie wykonywać pewien fragment kodu do jednego W tym celu należy zsynchronizować krytyczny fragment kodu

Synchronizacja metody public synchronized void Counter() {... } na czas wykonania metody synchronizowanej blokowana jest możliwość wywołania jakiejkolwiek innej metody synchronizowanej danego obiektu

Synchronizacja bloku instrukcji synchronized (obiekt) blokInstrukcji - na czas wykonywania blokuInstukcji dostęp do obiektu będzie zablokowany - jeśli w momencie rozpoczęcia bloku instrukcji wyrażenie będzie już zablokowane, wątek się zawiesi w oczekiwaniu na odblokowanie

Synchronizacja Wywołanie : wskaznikNaObiekt.metodaSynchr(arg,...); jest równoważne wywołaniu: synchronized(wskaznikNaObiekt) { wskaznikNaObiekt.metodaNieSyn(arg,...); }

Zwalnianie blokady obiektu Blokada jest zawsze zwalniana na końcu synchronizowanego bloku, nawet gdyby w wyniku wyjątku, instrukcji break lub return sterowanie wątku zostało przeniesione poza synchronizowany blok Ważne jest aby w celu zawieszenia pracy wątku używać metody wait() gdyż na czas zawieszenia zwalnia ona blokadę obiektu

Metoda wait() public final void wait() throws InterruptedException public final void wait(long timeout) throws InterruptedException public final void wait(long timeout, int nanos) throws InterruptedException Powoduje wstrzymanie pracy danego wątku aż zostanie wywołana metoda notify() lub notifyAll() lub upłynie czas podany jako argument

Metoda wait() W przeciwieństwie do metody sleep() jest zwalniana blokada obiektu Wyjątek zostanie rzucony, gdy inny wątek wywoła metodę interrupt() na rzecz tego wątku

Metody notify() i notifyAll() public final void notify() public final void notifyAll() Metoda notify() powoduje obudzenie jednego, natomiast metoda notifyAll() wszystkich wątków zatrzymanych metodą wait()

Metody wait(), notify(), notifyAll() Metody wait(), notify, notifyAll() muszą znajdować się wewnątrz synchronizowanego bloku lub metody. Jeśli zagnieździmy synchronizowane bloki lub metody, musimy pamiętać, że metody notify() i notifyAll() zwalniają blokadę tylko jednego obiektu, najbardziej wewnętrznego

Uups, coś nie wyszło, czyli Zakleszczenia Gdy piszemy program używając mechanizmów synchronizacji, możemy doprowadzić do sytuacji, gdy w zestawie współdziałających wątków każdy wątek jest zawieszony lub dobrowolnie wstrzymany i nie istnieje możliwość odwieszenia ani uwolnienia jakiegokolwiek wątku

Jak dochodzi do zakleszczeń Do zakleszczeń dochodzi, gdy jeden wątek, po założeniu blokady na pewien obiekt, próbuje uzyskać dostęp do innego obiektu, który jest blokowany przez drugi wątek, który próbuje uzyskać dostęp do obiektu zablokowanego przez pierwszy wątek

Przykład zakleszczenia Program monitoruje pracę dwóch osób Każda osoba informuje o postępach swoich i konkurenta

public class Worker implements Runnable { private long counter = 0; String name; Worker other; Worker (String name){ this.name = name; } Worker setOther(Worker other){ this.other = other; return this; } synchronized void showStatus(){ Master.sendMessage(name + " " + counter + ", other: " + other.peep()); } synchronized long peep(){ return counter; } public void run() { while(true) { counter++; showStatus(); }

import java.io.IOException; public class Master { static Worker tom, bob; public static void main(String[] args) throws IOException { tom = new Worker("Tom"); bob = new Worker("Bob"); new Thread(tom.setOther(bob)).start(); new Thread(bob.setOther(tom)).start(); System.in.read(); } static synchronized void sendMessage(String string){ System.out.println(string); }

I wynik działania programu: Tom 1, other: 0 Tom 2, other: 0 Tom 3, other: 0 Bob 1, other: 3 Bob 2, other: 3 Bob 3, other: 3 Bob 4, other: 3 Bob 5, other: 3 Bob 6, other: 3 Bob 7, other: 3 Bob 8, other: 3 Bob 9, other: 3 Tom 4, other: 10

Literatura Szkolenia firmy Sun na stronie Dokumentacja API Bruce Eckel „Thinking in Java” Jan Bielecki „Java od podstaw”