Programowanie współbieżne Laboratorium nr 11



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

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

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().

Kurs programowania. Wykład 8. Wojciech Macyna

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

Programowanie współbieżne Laboratorium nr 12

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

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

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

Java. Programowanie Obiektowe Mateusz Cicheński

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

Programowanie obiektowe

Podstawy współbieżności

Programowanie współbieżne Laboratorium nr 14. Synchronizatory

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

Język Java wątki (streszczenie)

Współbieżność w Javie

Współbieżność w Javie

Programowanie komputerów

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

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

Tworzenie i wykorzystanie usług

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

Aplikacja wielowątkowa prosty komunikator

Platformy Programistyczne Zagadnienia sieciowe i wątki

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

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

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

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

Wątki w Javie. Piotr Tokarski

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

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

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

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

JAVA I SIECI. MATERIAŁY:

Programowanie obiektowe

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

Język Java wątki (streszczenie)

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

Wykład 6. Rafał Skinderowicz

Programowanie obiektowe

Programowanie i projektowanie obiektowe

Aplikacja wielow tkowa prosty komunikator

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

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

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

Systemy Rozproszone - Ćwiczenie 4

Multimedia JAVA. Historia

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

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

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

Aplikacje RMI Lab4

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

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

Java: interfejsy i klasy wewnętrzne

Java Platform Micro Edition

Serwer współbieżny połączeniowy

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

Podstawy i języki programowania

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

Dokumentacja do API Javy.

Stanowe komponenty sesyjne

Wykład 2: Podstawy Języka

Programowanie rozproszone w języku Java

Zaawansowane aplikacje WWW - laboratorium

Programy typu klient serwer. Programowanie w środowisku rozproszonym. Wykład 5.

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

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Podstawy Programowania

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

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

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

Remote Method Invocation 17 listopada 2010

KLASY, INTERFEJSY, ITP

Podejście obiektowe do budowy systemów rozproszonych

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

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

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

Wywoływanie metod zdalnych

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Systemy Rozproszone - Ćwiczenie 6

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

1 Atrybuty i metody klasowe

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

Instrukcja implementacji sterownika wirtualnego portu szeregowego dla systemu Android. Opracowanie: Elzab Soft sp. z o.o.

Programowanie obiektowe

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

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

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

Operatory. Składnia. Typy proste. Znaki specjalne

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

Wykład 7: Pakiety i Interfejsy

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

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Wywoływanie metod zdalnych

Transkrypt:

Programowanie współbieżne Laboratorium nr 11 Wykonywane w danym momencie programy nazwano procesami [1] - izolowanymi, niezależnie wykonywanymi programami, dla których system operacyjny przydzielał pamięć, uchwyty plików i sprawdzał reguły bezpieczeństwa. Wątki [1] wprowadzają wiele strumieni wykonywania programu istniejących w tym samym czasie w jednym procesie. Współdzielą zasoby procesu takie jak pamięć i uchwyty plików, ale każdy wątek ma własny wskaźnik instrukcji, stos i zmienne lokalne. Klasa public abstract class Process: - public abstract InputStream getinputstream() - uzyskanie dostępu do strumienia standardowego wejścia procesu, - public abstract OutputStream getoutputstream() - uzyskanie dostępu do strumienia standardowego wyjścia procesu, - public abstract InputStream geterrorstream() - uzyskanie dostępu do strumienia standardowego wyjścia błędów procesu, - public abstract int waitfor() - oczekiwanie na zakończenie procesu, - public abstract int exitvalue() - sprawdzenie stanu końcowego procesu, - public abstract void destroy() - zniszczenie procesu. public static void testruntime() throws IOException,InterruptedException{ Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("ipconfig /all"); BufferedReader input = new BufferedReader( new InputStreamReader(process.getInputStream())); String s = null; while ((s = input.readline())!= null) if (s.length() > 0) System.out.println(s); input.close(); process.waitfor(); Process process2 = runtime.exec("notepad"); process2.waitfor(); Od wersji Javy 1.5 metoda ProcessBulider.start() jest zalecaną metodą tworzenia procesów. Klasa public final class ProcessBuilder: - ProcessBuilder(List<String> command)lub ProcessBuilder(String... command) - tworzy obiekt klasy z podanym programem systemu operacyjnego i argumentami, - public List<String> command() - zwraca programem systemu operacyjnego oraz argumenty, - public ProcessBuilder command(list<string> command)lub public ProcessBuilder command(string... command) - ustawia program systemu operacyjnego i argumenty, - public File directory() - zwraca katalog roboczy, - public ProcessBuilder directory(file directory) - ustawia katalog roboczy, - public Map<String,String> environment() - zwraca środowisko, - public boolean redirecterrorstream() - zwraca informację o tym, czy standardowe wyjście i standardowe wyjście błędów są połączone,

- public ProcessBuilder redirecterrorstream(boolean redirecterrorstream) - ustawia właściwość redirecterrorstream, - public Process start() - uruchamia nowy proces. public static void testprocessbuilder() throws IOException, InterruptedException { ProcessBuilder processbuilder = new ProcessBuilder("C:\\WINDOWS\\system32\\ipconfig", "/all"); processbuilder.directory(new File("C:\\")); Process process = processbuilder.start(); process.waitfor(); Klasa public class Thread (wybrane metody): public Thread.UncaughtExceptionHandler getuncaughtexceptionhandler()- zwraca procedurę obsługi wywoływaną gdy wątek zakończy się w wyniku wystąpienia niewyłapanego wyjątku (istnieje także getdefaultuncaughtexceptionhandler()), public long getid()- zwraca identyfikator wątku, public final String getname()- zwraca nazwę wątku, public Thread.State getstate()- zwraca stan wątku (NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED), public final boolean isdaemon()- sprawdza czy wątek jest tzw. wątkiem demonem, czyli wątkiem działającym w tle, public void join()- oczekuje na zakończenie się wątku, posiada także warianty przeciążone, public void run()- metoda, która ma się wykonywać współbieżnie, public final void setdaemon(boolean on)- służy do oznaczania wątku jako tzw. wątku demona lub wątku użytkownika, public void setuncaughtexceptionhandler(thread.uncaughtexceptionhandler eh)- ustawia procedurę obsługi wywoływaną gdy wątek zakończy się w wyniku wystąpienia niewyłapanego wyjątku (istnieje także setdefaultuncaughtexceptionhandler), public final void setname(string name)- ustawia nazwę wątku, public static void sleep(long millis)- usypia wątek na określony czas (chwilowo przerywa jego wykonanie), posiada także wariant przeciążony, public void start()- metoda służy do rozpoczęcia wykonywania się wątku, public static void yield()- powoduje, że aktualnie wykonujący się wątek chwilowo jest wstrzymywany i pozwala na wykonanie się innych wątków. Interfejs Runnable: public interface Runnable{ void run(); Uruchomienie zadania z wykorzystaniem interfejsu Runnable: class MyRunnable implements Runnable {... public class MyThreadTest { public static void main(string[] args) { Thread t = new Thread(new MyRunnable()); t.start();

Uruchomienie zadania z wykorzystaniem klasy Thread: class MyThread extends Thread {... public class MyThreadTest { public static void main(string[] args) { Thread t = new MyThread(); t.start(); Podstawową abstrakcją wykonania zadania [1] w bibliotekach Javy nie jest Thread, ale Executor (...). Interfejs Executor: interface Executor { void execute(runnable command); Obiekt klasy Executor [8] stanowi pośrednik pomiędzy klientem a wykonywanym zadaniem; klient zamiast uruchamiać zadanie wprost, zdaje się na obiekt wykonawcy. Bezpośrednie uruchomienie zadania [8]: new Thread(new(MojeZadanie())).start(); może zostać zastąpione poprzez [8]: Executor executor =...; executor.execute(new MojeZadanie()); Przykład pochodzi z Java Platform Standard Ed. 6, java.util.concurrent.executor class DirectExecutor implements Executor { public void execute(runnable r) { r.run(); Przykład pochodzi z Java Platform Standard Ed. 6, java.util.concurrent.executor class ThreadPerTaskExecutor implements Executor { public void execute(runnable r) { new Thread(r).start(); Pule wątków [1]: Executors.newFixedThreadPool() - pula wątków o stałym rozmiarze tworzy wątki przy nadchodzeniu nowych zadań aż do osiągnięcia maksymalnego rozmiaru. Następnie stara się utrzymać stały rozmiar puli (dodaje nowy wątek, gdy poprzedni wyłączy się lub zgłosi wyjątek). Executors.newCachedThreadPool() - (...) Dodaje nowe wątki, gdy wzrasta zapotrzebowanie na moc, ale nie ogranicza rozmiaru puli.

Executors.newSingleThreadExecutor() - jednowątkowy system wykonawczy tworzy jeden wątek zadaniowy przetwarzający zlecenia. Executors.newScheduleThreadPool() - pula wątków o stałym rozmiarze obsługująca zadania opóźnione i okresowe. Interfejs ExecutorService: public interface ExecutorService: - boolean awaittermination(long timeout, TimeUnit unit) - blokuje się dopóki wszystkie zadania zakończą się po żądaniu wyłączenia, lub nastąpi limit czasu lub bieżący wątek zostanie przerwany, - przeciążone wersje metod invokeall, submit oraz invokeany służą do wykonywania zadań, - boolean isshutdown()- zwraca prawdę jeżeli wykonawca został wyłączony, - boolean isterminated()- zwraca prawdę jeżeli wszystkie zadania zakończyły wyłączanie, - void shutdown()- inicjuje zamknięcie, przyjęte wcześniej zadania są wykonywane, ale nowe zadania nie są przyjmowane, - List<Runnable> shutdownnow()- próbuje zatrzymać wszystkie aktywnie wykonywane zadania; zatrzymuje przetwarzanie oczekujących zadań; zwraca listę zadań, które oczekiwały na wykonanie. Przykład implementacji interfejsu Executor: enum PriorityLevel { NO_PRIORITY(0), LOW_PRIORITY(1), MEDIUM_PRIORITY(2), HIGH_PRIORITY(3); private int value; PriorityLevel(int value) { this.value = value; int getvalue() { return value; class PriorityTask implements Runnable, Comparable<PriorityTask> { private PriorityLevel prioritylevel; private int tasknumber; private Runnable runnable; PriorityTask(int tasknumber, PriorityLevel priority, Runnable runnable) { this.tasknumber = tasknumber; this.prioritylevel = priority; this.runnable = runnable; System.out.printf("%-30s %d%n", "START " + this, System.currentTimeMillis()); runnable.run();

public int compareto(prioritytask t) { return t.prioritylevel.getvalue() - this.prioritylevel.getvalue(); public String tostring() { return tasknumber + ": " + prioritylevel; class PriorityExecutor implements Executor { PriorityExecutor(final ExecutorService executor, final boolean sleep) { new Thread() { try { if(sleep) TimeUnit.SECONDS.sleep(1); while (true) executor.execute(tasks.take()); catch (InterruptedException e) { throw new RuntimeException(e); finally { executor.shutdown();.start(); final PriorityBlockingQueue<Runnable> tasks = new PriorityBlockingQueue<Runnable>(); public void execute(runnable r) { tasks.add(r); public class TestPriorityExecutor { public static void main(string args[]) { Runnable r = new Runnable() { try { TimeUnit.SECONDS.sleep(1); catch (InterruptedException e) { e.printstacktrace(); ; PriorityExecutor executor = new PriorityExecutor(Executors.newSingleThreadExecutor(), false); executor.execute(new PriorityTask(1, PriorityLevel.NO_PRIORITY, r)); executor.execute(new PriorityTask(2, PriorityLevel.LOW_PRIORITY, r)); executor.execute(new PriorityTask(3, PriorityLevel.MEDIUM_PRIORITY, r)); executor.execute(new PriorityTask(4, PriorityLevel.HIGH_PRIORITY, r)); executor.shutdown();

Interfejs Callable: public interface Callable<V>{ V call(); Uruchomienie zadania z wykorzystaniem interfejsu Callable: private static <T extends Callable<U>, U> void test(list<t> tasks) { List<Future<U>> results = new ArrayList<Future<U>>(); ExecutorService executor = Executors.newCachedThreadPool(); for (T task : tasks) results.add(executor.submit(task)); for (Future<U> result : results) try { System.out.println(result.get()); catch (InterruptedException e) { e.getcause().printstacktrace(); catch (ExecutionException e) { e.getcause().printstacktrace(); executor.shutdown(); class MyCallableTaskDouble implements Callable<Double> { private Double a, b; MyCallableTaskDouble(Double a, Double b) { this.a = a; this.b = b; public Double call() throws Exception { return a / b; private static void testdouble() { ArrayList<MyCallableTaskDouble> tasksdouble = new ArrayList<MyCallableTaskDouble>(); tasksdouble.add(new MyCallableTaskDouble(1d, 0d)); tasksdouble.add(new MyCallableTaskDouble(-1d, 0d)); tasksdouble.add(new MyCallableTaskDouble(0d, 0d)); test(tasksdouble); Przykładowa treść laboratorium: 1. Przy pomocy ProcessBulider lub Runtime wyświetlić listę uruchomionych usług (net start) lub informacje o sterownikach (driverquery). 2. Uruchomić podane zadania wykorzystując: - Runnable, - Thread, - Callable, - Executors.newFixedThreadPool, - Executors.newCachedThreadPool(), - Executors.newSingleThreadExecutor().

Literatura: [1] Goetz B., Peierls T., Bloch J., Bowbeer J., Holmes D., Lea D., Java Współbieżność dla praktyków, Helion 2007 [2] Horstmann C.S., Cornell G., Java Podstawy, Helion, Wyd. VIII, 2009 [3] Horstmann C.S., Cornell G., Java Techniki zaawansowane, Helion, Wyd. VIII, 2009 [4] Eckel B.: Thinking in Java, Wyd. IV, Helion, 2006. [5] Bloch J.: Java Efektywne programowanie, Wyd. II, Helion, 2009. [6] Brackeen D., B. Barker, L. Vanhelsuwe: Java Tworzenie gier, Helion, 2004. [7] Silberschatz A., Galvin P. B., Gagne G.: Podstawy systemów operacyjnych, WNT, 2005 [8] Dokumentacja JavaDoc 1.6 htp://java.sun.com [9] Dokumentacja JavaDoc 1.7 htp://java.sun.com [10] The Java Language Specification, Third Edition, http://java.sun.com/docs/books/jls/download/langspec-3.0.pdf