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

Podobne dokumenty
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Ł

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

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

Programowanie komputerów

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

Java. Programowanie Obiektowe Mateusz Cicheński

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

Podstawy współbieżności

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

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

Wątki w Javie. Piotr Tokarski

Język Java wątki (streszczenie)

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

Programowanie współbieżne Laboratorium nr 11

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

Język Java wątki (streszczenie)

Java SE, Laboratorium nr 8 Wątki

Kurs programowania. Wykład 8. Wojciech Macyna

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

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

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

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

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

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

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

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

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

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

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

JAVA I SIECI. MATERIAŁY:

KLASY, INTERFEJSY, ITP

Dokumentacja do API Javy.

Współbieżność w Javie

Aplikacja wielowątkowa prosty komunikator

Programowanie obiektowe

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

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

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

Programowanie wielowątkowe. Tomasz Borzyszkowski

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

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

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

Programowanie obiektowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Zaawansowane aplikacje WWW - laboratorium

Współbieżność w Javie

Programowanie współbieżne Laboratorium nr 12

Generatory. Michał R. Przybyłek

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

1. Co można powiedzieć o poniższym kodzie? public class A { void m(int a) { } int m(string s) { return Integer.parseInt(s); }

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

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

RESTful Android. Na co zwrócić uwagę przy tworzeniu aplikacji klienckich REST na Androidzie

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

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

Programowanie i projektowanie obiektowe

Tworzenie i wykorzystanie usług

Java: interfejsy i klasy wewnętrzne

1. Co można powiedzieć o poniższym kodzie?

Operatory. Składnia. Typy proste. Znaki specjalne

package pakieta; import pakietb.b; package pakietb; public class B { B(){} public class A { private B b; A(B b) { this.b = b; } }

Aplikacje RMI Lab4

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

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

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

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

Programowanie Obiektowe Java

Zaawansowany kurs języka Python

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

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

Programowanie obiektowe

Programowanie obiektowe

Serwer współbieżny połączeniowy

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

Monitory. Jarosław Kuchta

Wykład 7: Pakiety i Interfejsy

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

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

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

PROGRAMOWANIE FUNKCYJNE

Wywoływanie metod zdalnych

Programowanie w Javie Lista nr 1. Wybieramy kategorię Java, a wśród Projektów Java Application i [NEXT]

Systemy Rozproszone - Ćwiczenie 4

Programowane refleksyjne i serializacja

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

Zaawansowane programowanie w C++ (PCP)

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

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);

Aplikacja wielow tkowa prosty komunikator

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

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

1 Atrybuty i metody klasowe

Stanowe komponenty sesyjne

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

1 Klasa File. 2 Writer. Programowanie w j zyku Java - Adam Krechowicz. Klasa File zapewnia podstawowe operacje na plikach

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

Remote Method Invocation 17 listopada 2010

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

Transkrypt:

WSPÓŁBIEŻNOŚĆ ZAGADNIENIA: procesy, wątki, synchronizacja, synchronizacja w Java 5.0 blokady, egzekutory, zbiory wątków MATERIAŁY: http://docs.oracle.com/javase/tutorial/essential/concurrency/ HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 1

PROCESY I WĄTKI Program w Javie uruchamiany jest w ramach pojedynczego procesu JVM. Z tego powodu implementacja współbieżności koncentruje się głównie na obsłudze wątków. Niemniej Java udostępnia także mechanizmy umożliwiające uruchamianie procesów systemu operacyjnego. Proces można stworzyć korzystając z metody Runtime.exec() lub klasy ProcessBuilder z pakietu java.lang. HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 2

PROCESY import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; public class ProcessExample { public static void main(string[] args) { try { String s; Process ps = Runtime.getRuntime().exec("ls -l"); BufferedReader bri = new BufferedReader(new InputStreamReader( ps.getinputstream())); BufferedReader bre = new BufferedReader(new InputStreamReader( ps.geterrorstream())); while ((s = bri.readline())!= null) System.out.println(s); bri.close(); HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 3

PROCESY while ((s = bre.readline())!= null) System.out.println(s); bre.close(); ps.waitfor(); catch (IOException e) { e.printstacktrace(); catch (InterruptedException e) { e.printstacktrace(); System.out.println("Gotowe."); HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 4

PROCESY Klasa ProcessBuilder pozwala precyzyjniej określić środowisko, w którym działa proces: ProcessBuilder builder = new ProcessBuilder("ls", "-l"); builder.directory(new File(".")); builder.redirecterrorstream(true); builder.redirectoutput(redirect.inherit); Process ps; try { ps = builder.start(); ps.waitfor(); catch (IOException InterruptedException e) { e.printstacktrace(); System.out.println("Gotowe."); Warto zajrzeć na: http://www.rgagnon.com/javadetails/java-0014.html HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 5

WĄTKI Istnieją dwa podstawowe sposoby tworzenia wątków. Pierwszy polega na rozszerzeniu klasy java.lang.thread: public class HelloThread extends Thread { public void run() { System.out.println("Witam z wątku"); public static void main(string args[]) { Thread t = new HelloThread(); t.start(); System.out.println("Witam z programu"); HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 6

WĄTKI Drugi opiera się na skonstruowaniu wątku w oparciu o klasę implementującą interfejs java.lang.runnable: public class HelloRunnable implements Runnable { public void run() { System.out.println("Witam z watku"); public static void main(string args[]) { Thread t = new Thread(new HelloRunnable()); t.start(); System.out.println("Witam z programu"); Ten przypadek jest ogólniejszy (i zalecany), gdyż klasa implementująca wątek może rozszeżać inną klasę. HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 7

KLASA THREAD Wątki mogą być wstrzymywanie oraz wzbudzane/przerywane: public class InterruptExample implements Runnable{ public void run() { try { Thread.sleep(10000); // wstrzymanie na 10 sek. catch (InterruptedException e) { System.out.println("interupted"); public static void main(string[] args) throws InterruptedException{ Thread t = new Thread(new InterruptExample()); t.start(); Thread.sleep(5000); System.out.println("budzenie"); t.interrupt(); HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 8

KLASA THREAD Można również poczekać na zakończenie wskazanego wątku. public class JoinExample implements Runnable{ public void run() { try { Thread.sleep(5000); catch (InterruptedException e) { return; System.out.println("watek"); public static void main(string[] args) throws InterruptedException{ Thread t = new Thread(new JoinExample()); t.start(); t.join(); // czekamy na zakonczenie t System.out.println("teraz ja"); HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 9

SYNCHRONIZACJA Wątki mogą się komunikować przez dowolne współużytkowane zasoby (np. referencje do obiektów). Jest to bardzo efektywne, jednak może powodować problemy, gdy kilka wątków korzysta z jednego zasobu. class Counter { private int c = 0; public void increment() { c++; public void decrement() { c--; public int value() { return c; HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 10

SYNCHRONIZACJA METOD Problem ten rozwiązuje się używając synchronizacji. Oznaczenie metod słowem synchronized powoduje, że w danej chwili może być wykonywana tylko jedna z nich (i tylko przez jeden wątek). class SynchronizedCounter { private int c = 0; public synchronized void increment() { c++; public synchronized void decrement() { c--; public synchronized int value() { return c; HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 11

BLOKADA WEWNĘTZNA Każdy obiekt posiada powiązaną z nim blokadę wewnętrzna (intrinsic lock). Jeśli wątek chce uzyskać wyłączny dostęp do obiektu (lub jego atrybutów) może skorzystać z tej blokady. public void addname(string s) { synchronized(this) { name = s; counter++; namelist.add(name); Wątek musi jednoznacznie wskazywać obiekt, z którym jest związana używana przez niego blokada. Taki tyb klokad nazywamy synchronizacją na poziomie instrukcji (synchronized statements) HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 12

BLOKADA DROBNOZIARNISTA Dostęp do c1 i c2 musi być synchronizowany niezależnie - nie chcemy blokować na raz obu liczników. public class FineGrainedLockEx { private long c1 = 0, c2 = 0; private Object lock1 = new Object(); private Object lock2 = new Object(); public void inc1() { synchronized(lock1) { c1++; public void inc2() { synchronized(lock2) { c2++; HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 13

OPERACJE ATOMOWE Typowo dostęp do zmienne/referencji nie jest realizowany jako pojedyncza operacja. Aby takie operacje (odczytu/zapisu zmiennej) były atomowe należy oznaczyć ją słowem volatile. UWAGA: private volatile long c1 = 0; więcej: public void inc1() { c1 += 5; // nie jest atomowa bo atomowy jest odczyt i zapis // wartosci a nie jej zwiekszanie http://www.javamex.com/tutorials/synchronization_volatile.shtml HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 14

TYPOWE PROBLEMY W programach wielowątkowych występuje kilka rodzajów problemów, które mogą powodować niewłaściwe działanie programów: zakleszczenia (deadlock) wątek blokują wzajemnie zasoby potrzebne im do dalszego działania (pięciu flozofów). zagłodzenia (starvation) - jeden wątek przez cały blokuje zasób potrzebny innym wątkom. livelock odwrotność deadlocka wątek reaguje na zachowanie drugiego wątku, które jest reakcją na zachowanie pierwszego wątku. HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 15

ZAKLESZCZENIE public class Deadlock { static class Worker { public String name; public Worker(String name) { this.name = name; public synchronized void dowork(worker w){ System.out.println(this.name + " pracuje z " + w.name); try { Thread.sleep(1000); // pracujemy catch (InterruptedException e) { w.release(); public synchronized void release() { System.out.println(this.name + " jest znowu gotowy"); HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 16

ZAKLESZCZENIE public static void main(string[] args) { final Worker w1 = new Worker("w1"); final Worker w2 = new Worker("w2"); new Thread(new Runnable() { public void run() { w1.dowork(w2); ).start(); new Thread(new Runnable() { public void run() { w2.dowork(w1); ).start(); Obaj workerzy zaczną ze sobą pracować. Blokada nastąpi na metodzie release() w obu obiektach. HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 17

WAIT / NOTIFY Często wątek musi poczekać, aż inny wąteg wykona określoną część swoich zadań, np. jeden wątek oblicza wyniki, a drugi je sukcesywnie wypisuje na ekranie. public synchronized consume() { while(!available) { try { wait(); // wstrzymuje dzialanie watku i zwalnia blokadę catch (InterruptedException e) { System.out.println("Skonsumowane"); available = false; public synchronized produce() { doproduce(); available = true; notifyall(); // powiadamia (budzi) wszystkie czekajace watki HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 18

SYNCHRONIZACJA W JRE 5.0 Począwszy od wersji 5.0 Java udostępnia dodatkowe, wysokopoziomowe API ułatwiające synchronizację wątków. Przykład - blokady: import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; public class LockObjects { static class Worker { public Lock lock = new ReentrantLock(); public String name; public Worker(String name) { this.name = name; HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 19

BLOKADY public boolean tryworking(worker w) { boolean mylock = lock.trylock(); boolean wlock = w.lock.trylock(); if (!(mylock && wlock)) { // zwalniamy blokady if (mylock) lock.unlock(); if (wlock) w.lock.unlock(); return mylock && wlock; public synchronized void dowork(worker w) { boolean done = false; HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 20

BLOKADY while (!done) { if (tryworking(w)) { System.out.println(name + ": pracuje z " + w.name); try { Thread.sleep(1000); catch (InterruptedException e) { w.release(); this.lock.unlock(); done = true; else { System.out.println(name+": jestem zajety wiec czekam"); try { wait(); catch (InterruptedException e) { System.out.println(this.name + ": probuje znowu"); HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 21

BLOKADY public synchronized void release() { System.out.println(this.name + ": jestem znowu gotowy"); this.lock.unlock(); notifyall(); public static void main(string[] args) { final Worker w1 = new Worker("w1"); final Worker w2 = new Worker("w2"); new Thread(new Runnable() { public void run() { w1.dowork(w2); ).start(); new Thread(new Runnable() { public void run() { w2.dowork(w1); ).start(); HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 22

EXECUTORS Egzekutory oddzielają wątek od zarządzania nim Executor exec =...; executor.execute(new RunnableTask1()); executor.execute(new RunnableTask2()); Executor jest rozszerzany przez ExecutorService, który dodatkowo umożliwia uruchamianie wątków Callable, które mogą zwracać wynik działania. Kolejnym rodzajem egzekutorów są tzw. Thread Pools zbiory, wspólnie zarządzanych wątków. W JRE 7.0 wprowadzono ForkJoinPool, przeznaczony do wieloprocesorowych obliczeń równoległych. HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 23

EXECUTORS import java.util.concurrent.forkjoinpool; import java.util.concurrent.recursivetask; public class Fibonacci extends RecursiveTask<Integer>{ final int n; public Fibonacci(int n){ this.n = n; protected Integer compute() { if (n>2){ dorecursion(); else{ return 1; HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 24

EXECUTORS public Integer dorecursion(){ Fibonacci f1 = new Fibonacci(n-1); Fibonacci f2 = new Fibonacci(n-2); f2.fork(); return f1.compute()+f2.join(); public static void main(string[] args) { Fibonacci f = new Fibonacci(35); ForkJoinPool pool = new ForkJoinPool(); System.out.println(pool.invoke(f)); Ponadto wprowadzono także wspólbieżny generator liczb losowych: ThreadLocalRandom, HTTP://USERS.UJ.EDU.PL/~CIESLA/ JĘZYK JAVA, FAIS UJ 2012/2013 25

ĆWICZENIA Proszę zaimplementować dowolny algorytm typu dziel i zwyciężaj (np. sortowanie szybkie) wykorzystując wątki. Proszę porównać wydajność algorytmu wielowątkowego z wersją iteracyjną dla różnych rozmiarów danych wejściowych, a następnie spróbować wytłumaczyć otrzymane wyniki. http://th-www.if.uj.edu.pl/zfs/ciesla/ JĘZYK JAVA, FAIS UJ 2016/2017 26

DZIĘKUJĘ ZA UWAGĘ