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

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

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

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

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

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

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

Wątki w Javie. Piotr Tokarski

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

Java. Programowanie Obiektowe Mateusz Cicheński

Język Java wątki (streszczenie)

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

Programowanie komputerów

Współbieżność w Javie

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

Współbieżność w Javie

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

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

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

Programowanie współbieżne Laboratorium nr 11

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

Podstawy współbieżności

Język Java wątki (streszczenie)

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

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

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

Java SE, Laboratorium nr 8 Wątki

Kurs programowania. Wykład 8. Wojciech Macyna

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

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

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

1 Atrybuty i metody klasowe

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

Programowanie wielowątkowe. Tomasz Borzyszkowski

Multimedia JAVA. Historia

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

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

Programowanie obiektowe

Dokumentacja do API Javy.

Wywoływanie metod zdalnych

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

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Wykład 6. Rafał Skinderowicz

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

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

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

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

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

Programowanie w Internecie. Java

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

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

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

Programowanie obiektowe

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ć

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Metody Metody, parametry, zwracanie wartości

Programowanie obiektowe

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Programowanie współbieżne Laboratorium nr 12

Remote Method Invocation 17 listopada 2010

Aplikacja wielowątkowa prosty komunikator

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

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

Programowanie Obiektowe Java

Programowanie obiektowe

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Podejście obiektowe do budowy systemów rozproszonych

Wywoływanie metod zdalnych

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

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

TimeUnit.SECONDS.sleep(1); } } catch (InterruptedException e) { System.out.println("INTERRUPT " + System.nanoTime() + " " + isinterrupted()); }

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

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

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

Wykład 7: Pakiety i Interfejsy

Programowanie obiektowe

Aplikacje RMI Lab4

Wykład 6: Dziedziczenie

Programowanie obiektowe

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

1. Co można powiedzieć o poniższym kodzie (zakładając, że znajduje się on w jednym pliku A.java)?

Wprowadzenie do programowania współbieżnego. Grafika, Proste Animacje

Podstawy Języka Java

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

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

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 współbieżne i rozproszone

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

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

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

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Programowanie obiektowe

Java niezbędnik programisty spotkanie nr 3. Modyfikatory, jednostki kompilacji, tworzenie/inicjalizacja, odśmiecanie/ finalizacja...

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

Dawid Gierszewski Adam Hanasko

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Transkrypt:

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

Java Model współbieżności Javy opiera się na realizacji szeregu omawianych dotychczas elementów: zarządzanie wątkami operacje atomowe (wiele standardowych operacji na referencjach, zmiennych typów wbudowanych, operacje na zmiennych deklarowanych jako volatile, a także specjalne operacje takie jak np. compareandset, getandincrement itp.) mechanizmy synchronizacji (zamki, zmienne warunku i inne charakterystyczne dla funkcjonowania obiektów) klasy kontenerowe przystosowane do współbieżnego używania, takie jak: BlockingQueue, ConcurrentMap itp. Krzysztof Banaś Obliczenia równoległe 2

Klasy, obiekty i współbieżność Atrybuty obiektów w programach współbieżnych niosą te same ryzyka błędów przy wykonaniu współbieżnym co zmienne globalne w programach proceduralnych Metody obiektów mogą zostać wywołane przez procedury z dowolnych wątków Wymaganiem dla każdej projektowanej klasy, której obiekty mogą być wykorzystywane przez obiekty innych klas jest bezpieczeństwo wątkowe (thread safety) Od wszystkich ogólnie dostępnych bibliotek wymaga się bezpieczeństwa wątkowego Pośrednim rozwiązaniem, nie zawsze możliwym jest wykorzystanie klas niezmiennych (immutable) Krzysztof Banaś Obliczenia równoległe 3

Wątki w Javie Narzędzia udostępniane przez Javę programistom tworzącym programy wielowątkowe należą do typowych konstrukcji obiektowych: klasy, interfejsy, metody wątek w Javie jest także obiektem (klasy Thread z pakietu java.lang) Wielowątkowość jest wbudowana w same podstawy systemu podstawowa klasa Object zawiera metody związane z przetwarzaniem współbieżnym (wait, notify, notifyall) każdy obiekt może stać się elementem przetwarzania współbieżnego Krzysztof Banaś Obliczenia równoległe 4

Wątki w Javie W jaki sposób sprawić żeby przetwarzanie stało się współbieżne zaprojektować obiekt z metodą przeznaczoną do rozpoczęcia przetwarzania współbieżnego uruchomić nowy wątek realizujący metodę Istnieją dwa sposoby uruchamiania wątków w Javie poprzez przekazanie obiektu, którego metodę chcemy wykonać, jako argumentu dla metody start obiektu klasy Thread nasz obiekt musi implementować interfejs Runnable uruchamiana metoda musi implementować metodę run poprzez uruchomienie metody start naszego obiektu nasz obiekt musi być obiektem klasy pochodnej klasy Thread uruchamiana metoda musi przeciążać metodę run Krzysztof Banaś Obliczenia równoległe 5

Wątki w Javie przykłady public class HelloRunnable implements Runnable { public void run() { System.out.println("Hello from a thread!"); public static void main(string args[]) { (new Thread( new HelloRunnable())).start(); public class HelloThread extends Thread { public void run() { System.out.println("Hello from a thread!"); public static void main(string args[]) { (new HelloThread()).start(); Klasa może dziedziczyć po innych klasach Klasa nie może dziedziczyć po innych klasach Krzysztof Banaś Obliczenia równoległe 6

Wątki w Javie Podstawowe metody klasy Thread (pakiet java.lang) void start() polecenie dla JVM uruchomienia metody run void run() uruchomienie metody run przekazanego obiektu implementującego interfejs Runnable (jeśli nie została przeciążona) static void sleep(long millis) uśpienie bieżącego wątku na określony czas void join(long millis), void join() oczekiwanie na zakończenie wątku void interrupt() przerwanie działania wątku (dokładniej ustawienie sygnalizatora przerwania przerwanie następuje jeśli wątek znajduje się wewnątrz metody dającej się przerwać, np. sleep, join, wait lub jeśli w trakcie realizacji wątku wywołana jest metoda: static boolean interrupted() sprawdzenie stanu sygnalizatora przerwania (dla bieżącego wątku) później powinna znajdować się reakcja wątku na próbę przerwania, np. zwrócenie wyjątku InterruptedException Krzysztof Banaś Obliczenia równoległe 7

Wątki w Javie przykład private static class obiektrunnable implements Runnable { public void run() { try { Thread.sleep(4000); for (int i = 0; i < number; i++) { obliczenia(); if (Thread.interrupted()) { throw new InterruptedException(); catch (InterruptedException e) { // reakcja na przerwanie Krzysztof Banaś Obliczenia równoległe 8

Wątki w Javie przykład public class TestThreads { public static void main(string args[]) throws InterruptedException { Thread t = new Thread(new obiektrunnable()); t.start(); t.join(1000); // oczekiwanie 1 sekundę if (t.isalive()) { t.interrupted(); t.join(); boolean isalive(), boolean isinterrupted() procedury sprawdzenia czy dany wątek jest wykonywany i czy został przerwany Krzysztof Banaś Obliczenia równoległe 9

Wątki w Javie synchronizacja Działanie dowolnego obiektu w Javie można uczynić bezpiecznym ze względu na wykonanie wielowątkowe poprzez określanie jego metod jako synchronizowanych Jeżeli metoda jest określona jako synchronizowana, wtedy jej realizacja przez jakiś wątek uniemożliwia realizację dowolnej synchronizowanej metody tego obiektu przez inne wątki (wątki zgłaszające chęć wywołania dowolnej synchronizowanej metody tego obiektu są w takiej sytuacji ustawiane w kolejce wątków oczekujących) ten sam wątek może realizować kolejne wywołania synchronizowanych metod w momencie zakończenia realizacji wszystkich synchronizowanych metod obiektu przez dany wątek JVM wznawia działanie pierwszego wątku oczekującego w kolejce Uwaga: konstruktory nie mogą być synchronizowane Krzysztof Banaś Obliczenia równoległe 10

Wątki w Javie synchronizacja Mechanizm synchronizacji w Javie opiera się na istnieniu wewnętrznych zamków monitorowych (monitor locks) zwanych często w skrócie monitorami Z każdym obiektem w Javie związany jest zamek monitorowy wątek rozpoczynający wykonywanie synchronizowanej metody obiektu zajmuje zamek tego obiektu żaden inny wątek nie otrzyma go dopóki dany wątek nie zwolni zamka zamek związany z danym obiektem można zająć także rozpoczynając wykonanie bloku synchronizowanego rozpoczynając wykonanie synchronizowanej statycznej funkcji klasy zajmuje się zamek związany z obiektem reprezentującym daną klasę Krzysztof Banaś Obliczenia równoległe 11

Wątki w Javie synchronizacja przykład public class Liczniki { private long c1 = 0; private long c2 = 0; public synchronized void inc1() { c1++; public synchronized void inc2() { c2++; Krzysztof Banaś Obliczenia równoległe 12

Wątki w Javie synchronizacja Synchronizowany blok oznacza się określeniem synchronized z argumentem będącym referencją do obiektu, którego zamek ma zostać zajęty najczęściej przesyłana jest referencja do obiektu, w klasie którego blok jest zdefiniowany (referencja this) dzięki temu tylko część kodu obiektu jest synchronizowana Można tworzyć odrębne obiekty, których jedyną funkcją będzie występowanie jako argument przy synchronizacji bloków takie obiekty pełnią rolę zbliżoną do muteksów jedna z różnic polega na braku realizacji metody trylock dlatego Java w pakiecie java.util.concurrency udostępnia interfejs Lock (posiadający standardowe funkcje muteksa) i jego kilka implementacji (np. typowy ReentrantLock) Krzysztof Banaś Obliczenia równoległe 13

Wątki w Javie synchronizacja przykład public class LicznikiMuteksy { private long c1 = 0; private long c2 = 0; private Object lock1 = new Object(); private Object lock2 = new Object(); public void inc1() { synchronized(lock1) { c1++; public void inc2() { synchronized(lock2) { c2++; Krzysztof Banaś Obliczenia równoległe 14

Wątki w Javie zmienne i operacje atomowe import java.util.concurrent.atomic.atomicinteger; public class LicznikiAtomowe{ private AtomicInteger c1 = new AtomicInteger(0); private AtomicInteger c2 = new AtomicInteger(0); public void inc1() { try { c1.incrementandget(); catch (InterruptedException e) { // reakcja na przerwanie public void inc2() { try { c2.incrementandget(); catch (InterruptedException e) { // reakcja na przerwanie Krzysztof Banaś Obliczenia równoległe 15

Java obliczenia masowo równoległe Dotychczas omówione mechanizmy ukierunkowane były głównie na przetwarzanie wielowątkowe z mała liczbą zadań Dla masowej równoległości Java posiada specjalne udogodnienia: pule wątków (thread pool) i interfejsy wykonawców (executor) Konkretna pula wątków (obiekt klasy ThreadPoolExecutor ) realizuje zarządzanie dostarczonymi zadaniami (obiektami implementujacymi interfejs Runnable lub Callable), które może obejmować: uruchamianie, zatrzymywanie, sprawdzanie stanu itp. Uruchamianie zadań w ramach wykonawców posiada mniejszy narzut niż uruchamianie nowych wątków (klasy Thread) Krzysztof Banaś Obliczenia równoległe 16

Pula wątków Krzysztof Banaś Obliczenia równoległe 17

Prosty przykład puli wątków w Javie import java.util.concurrent.executorservice; import java.util.concurrent.executors; public class Simple_executor_test { private static final int NTHREADS = 10; public static void main(string[] args) { Licznik licznik = new Licznik(); ExecutorService executor = Executors.newFixedThreadPool(NTHREADS); for (int i = 0; i < 50; i++) { Runnable zwiekszaczlicznikow = new ZwiekszaczLicznikow(licznik); executor.execute(zwiekszaczlicznikow); executor.shutdown(); // egzekutor przestaje przyjmować nowe wątki while (!executor.isterminated()) { // oczekiwanie na zakończenie pracy wątków Krzysztof Banaś Obliczenia równoległe 18

Pule wątków Najprostsze zadania (interfejs Runnable) nie zwracają wyniku Interfejs Callable umożliwia definiowanie zadań zwracających wynik Do przekazywania wyników z obiektów Callable i sprawdzania zakończenia działania obiektów Runnable służą obiekty Futures interfejs Futures jest parametryzowany typem zwracanego wyniku interfejs Futures definiuje funkcje do: sprawdzania czy zadanie zostało zakończone oczekiwania na zakończenie zadania i pobierania wyniku realizacji zadania zapisanego w obiekcie Futures anulowania zadań i sprawdzania czy zostały anulowane Krzysztof Banaś Obliczenia równoległe 19

Pule wątków public static void main(string args[]){ ExecutorService executor = Executors.newFixedThreadPool(10); List<Future<String>> list = new ArrayList<Future<String>>(); for(int i=0; i< 100; i++){ Callable<String> callable = new HelloFuture(i); Future<String> future = executor.submit(callable); list.add(future); for(future<string> future_string : list){ try { System.out.println(future_string.get()); catch (InterruptedException ExecutionException e) { e.printstacktrace(); executor.shutdown(); Krzysztof Banaś Obliczenia równoległe 20

Pule wątków import java.util.concurrent.callable; import java.util.concurrent.executionexception; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.future; public class HelloFuture implements Callable<String> { private int task_no; public HelloFuture(Integer Task_no) { this.task_no = Task_no; public String call() throws Exception { return("hello from task "+task_no+"(thread: " +Thread.currentThread().getName()+")"); Krzysztof Banaś Obliczenia równoległe 21

Work stealing Technika kradzieży pracy (?) (work stealing) jest sposobem na efektywne dzielenie dużej liczby zadań pomiędzy wątki decyzja o przydziale zadania jest podejmowana tylko jeśli jakiś wątek nie ma w danym momencie nic do zrobienia Strategia work stealing jest realizowana np. w klasie ForkJoinPool bedącej realizacją wzorca fork join (recursive splitting) Krzysztof Banaś Obliczenia równoległe 22

Prosty przykład interfejsu ForkJoin import java.util.concurrent.forkjoinpool; import java.util.concurrent.recursiveaction; import java.util.concurrent.recursivetask; // umożliwia zwracanie wyniku class MaxTask extends RecursiveTask<Double> { private double[] arrayformax; private int index_start; private int index_end; final private int THRESHOLD = 100; public MaxTask(double[] arrayformax, int index_start, int index_end) { this.index_start = index_start; this.index_end = index_end; this.arrayformax = arrayformax; public double maxseq(){ double maxloc=arrayformax[index_start]; for (int i = index_start; i <= index_end; i++) { if(arrayformax[i]>maxloc) maxloc = arrayformax[i]; return maxloc; Krzysztof Banaś Obliczenia równoległe 23

Prosty przykład interfejsu ForkJoin protected Double[] compute() { System.out.println("Task: ( " + index_start + ", " + index_end + ")"); if ((index_end - index_start) <= THRESHOLD) { return maxseq(); int index_mid = (index_start + index_end) / 2; MaxTask left = new MaxTask(arrayForMax, index_start, index_mid-1); MaxTask right = new MaxTask(arrayForMax, index_mid, index_end); left.fork(); right.fork(); double leftmax = left.join(); double rightmax = right.join(); return Math.max(leftMax, rightmax); Krzysztof Banaś Obliczenia równoległe 24

Prosty przykład z interfejsem ForkJoin import java.util.concurrent.forkjoinpool; import java.util.concurrent.recursiveaction; import java.util.concurrent.recursivetask; public class ForkJoinTest { public static void main(string[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Set array size: "); int totalnumbers = scanner.nextint(); double[] numbers = new double[totalnumbers]; //...nadanie wartości w tablicy int i_p = 0; int i_k = totalnumbers-1; MaxTask task = new MaxTask(numbers, i_p, i_k); ForkJoinPool forkjoinpool = new ForkJoinPool(); forkjoinpool.invoke(task); // invoke umożliwia oczekiwanie na wynik //forkjoinpool.execute(task); System.out.println("Max el in array: " + task.join()); Krzysztof Banaś Obliczenia równoległe 25