Systemy Rozproszone - Ćwiczenie 4

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

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

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

Kurs programowania. Wykład 8. Wojciech Macyna

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

Java. Programowanie Obiektowe Mateusz Cicheński

Język Java wątki (streszczenie)

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

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

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

Systemy Rozproszone - Ćwiczenie 6

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

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

Język Java wątki (streszczenie)

Podstawy współbieżności

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

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

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

Programowanie współbieżne Laboratorium nr 11

Współbieżność w Javie

Generatory. Michał R. Przybyłek

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

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

Programowanie i projektowanie obiektowe

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

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

Programowanie komputerów

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

Współbieżność w Javie

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

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

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

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

Model pamięci. Rafał Skinderowicz

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

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

Kurs programowania. Wykład 9. Wojciech Macyna

Programowanie obiektowe

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

Wątki w Javie. Piotr Tokarski

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

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

Git, Bitbucket, IntelliJ IDEA

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

Metody Metody, parametry, zwracanie wartości

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

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

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

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

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

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

Zaawansowane aplikacje WWW - laboratorium

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

Monitory. Jarosław Kuchta

Programowanie wielowątkowe. Jarosław Kuchta

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

Aplikacja wielowątkowa prosty komunikator

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

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

Programowanie i projektowanie obiektowe

Kiedy potrzebne. Struktura (rekord) Struktura w języku C# Tablice struktur. struktura, kolekcja

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

Podstawy programowania w lejos

Programowanie obiektowe

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

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

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

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

Stanowe komponenty sesyjne

Java SE, Laboratorium nr 8 Wątki

Technologie i usługi internetowe cz. 2

Komponenty sterowane komunikatami

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

Programowanie wielowątkowe. Tomasz Borzyszkowski

Badania poziomu bezpieczeństwa portalu dostępowego do infrastruktury projektu PL-Grid

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

Aplikacje internetowe i rozproszone - laboratorium

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

Algorytmy z powrotami. Algorytm minimax

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

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

Wprowadzenie. Narzędzia i środowiska programistyczne. Laboratorium 1. Prowadzący: Kierunek: Semestr: Rok: Tomasz Gądek Informatyka Zimowy 2

Java Programowanie Obiektowe Ćwiczenie 1- wprowadzenie

Podstawy Programowania

Aplikacje w środowisku Java

Wywoływanie metod zdalnych

Katalog książek cz. 2

Java: interfejsy i klasy wewnętrzne

Podstawy Języka Java

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

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

KLASY, INTERFEJSY, ITP

Przypomnienie o klasach i obiektach

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Języki i metody programowania Java Lab2 podejście obiektowe

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

JAVA W SUPER EXPRESOWEJ PIGUŁCE

WSNHiD, Programowanie 2, Lab. 3. Trwałość danych

Transkrypt:

Systemy Rozproszone - Ćwiczenie 4 1 Synchronizacja wątków: myjnia samochodowa Poniżej znajduje się przykład ilustrujący klasyczny problem synchronizacji wątków. Obiekt klasy Car jest współdzielony przez 2 wątki. Samochód może znajdować się w jednym w 2 stanów: nawoskowany (waxed==true) i wypolerowany (waxed==false). Na samochodzie działają 2 wątki: Waxer, którego zadaniem jest nawoskowanie samochodu, oraz Polisher, którego zadaniem jest jest wypolerowanie samochodu. Nawoskowanie samochodu jest możliwe tylko wtedy jeżeli samochód jest wypolerowany (czyli ma stan waxed==false) i skutkuje zmianą jego stanu na waxed==true. Wypolerowanie samochodu jest możliwe tylko wtedy jeżeli samochód jest nawoskowany (czyli ma stan waxed==true) i skutkuje jego zmianą stanu na waxed==false. Obydwa wątki wykonują swoje działania w nieskończonej pętli, a oczekiwanie wątku na osiągnięcie właściwego stanu przez samochód odbywa się w metodach waituntilwaxed() i waituntilpolished(). Wykonaniu działana na samochodzie (metody polish() i wax()) skutkuje zmianą jego stanu, i wznowieniem pracy przez oczekujący wątek. Zawieszenie pracy wątku uzyskuje się wywołując metodę Thread.wait(), a wznowienie pracy wszystkich oczekujących wątków uzyskuje się poprzez wywołanie metody Thread.notifyAll(). Wątek główny, po uruchomieniu wątków Waxer i Polisher, odczekuje 100ms Thread.sleep(), a następnie przerywa pracę 2 wątków Thread.interrupt(). / p l i k : WaxOMatic. java / class Car boolean waxed = f a l s e ; public synchronized void wax ( ) throws InterruptedException w a i t U n t i l P o l i s h e d ( ) ; waxed = true ; public synchronized void p o l i s h ( ) throws InterruptedException waituntilwaxed ( ) ; waxed = f a l s e ; 1

public synchronized boolean iswaxed ( ) return waxed ; private synchronized void waituntilwaxed ( ) throws InterruptedException while (! iswaxed ( ) ) + " i s waiting u n t i l waxed" ) ; private synchronized void w a i t U n t i l P o l i s h e d ( ) throws InterruptedException while ( iswaxed ( ) ) + " i s waiting u n t i l p o l i s h e d " ) ; class Waxer extends Thread Car car ; public Waxer( Car c ) car = c ; + " i s waxing... " ) ; car. wax ( ) ; + " f i n i s h e d waxing" ) ; System. out. p r i n t l n ( "Waxer i n t e r r u p t e d " ) ; class P o l i s h e r extends Thread Car car ; public P o l i s h e r ( Car c ) 2

car = c ; + " i s p o l i s h i n g... " ) ; car. p o l i s h ( ) ; + " f i n i s h e d p o l i s h i n g " ) ; System. out. p r i n t l n ( " P o l i s h e r i n t e r r u p t e d " ) ; public class WaxOMatic public static void main ( S t r i n g [ ] args ) throws Exception Car car = new Car ( ) ; Waxer waxer = new Waxer( car ) ; P o l i s h e r p o l i s h e r = new P o l i s h e r ( car ) ; waxer. s t a r t ( ) ; p o l i s h e r. s t a r t ( ) ; Thread. s l e e p ( 1 0 0 ) ; waxer. i n t e r r u p t ( ) ; p o l i s h e r. i n t e r r u p t ( ) ; Wprowadź następujące modyfikacje do programu: Dodaj opóznienie do metod wax() i polish polish() symulujące czas wykonania działania na samochodzie. Jak wpłynie to na działanie programu. Wprowadz dodatkowy wątek do programu Washer, którego zadaniem jest mycie samochodu, w taki sposób, żeby samochód zmieniał stany w następujący sposób: waxed polished washed waxed polished washed.... 2 Problem producenta i konsumenta Kolejny przykład ilustruje klasyczny problem producenta i konsumenta w odniesieniu do dwóch wątków działających na współdzielonym stosie WaitingStack. 3

Pierwszy wątek, StackPusher, pełni rolę producenta i jego zadaniem jest wkładanie elementów na stos. Drugi wątek, StackPopper, pełni rolę konsumenta i jego zadaniem jest zdejmowania elementów ze stosu. Zwróć uwagę na metody waitfornotempty(), waitforfullempty(), push(), pop(). / p l i k : WaitingStack. java / class WaitingStack int [ ] data ; int c a p a c i t y ; int c u r r e n t = 1; public WaitingStack ( int count ) c a p a c i t y = count ; data = new int [ count ] ; public synchronized void push ( int number ) throws InterruptedException S t r i n g name = Thread. currentthread ( ). getname ( ) ; System. out. format ( "%s : entered push ( ) \ n", name ) ; waitfornotfull ( ) ; System. out. format ( "%s : can push ( ) \ n", name ) ; c u r r e n t++; data [ c u r r e n t ] = number ; System. out. format ( "%s pushed %d to [%d ] \ n", name, number, c u r r e n t ) ; System. out. format ( "%s : ended push ( ) \ n", name ) ; public synchronized int pop ( ) throws InterruptedException S t r i n g name = Thread. currentthread ( ). getname ( ) ; System. out. format ( "%s : entered pop ( ) \ n", name ) ; waitfornotempty ( ) ; System. out. format ( "%s : can pop\n", name ) ; int value = data [ c u r r e n t ] ; System. out. format ( "%s : popped %d from [%d ] \ n", name, value, c u r r e n t ) ; current ; System. out. format ( "%s : ended pop ( ) \ n", name ) ; return value ; private synchronized void waitfornotempty ( ) throws InterruptedException 4

while ( c u r r e n t== 1) + " i s waiting to pop" ) ; private synchronized void waitfornotfull ( ) throws InterruptedException while ( c u r r e n t==capacity 1) + " i s waiting to push" ) ; c l a s s StackPusher extends Thread WaitingStack stack ; int value = 0 ; public StackPusher ( WaitingStack ws ) stack = ws ; s l e e p ( 1 0 0 ) ; stack. push(++value ) ; y i e l d ( ) ; + " i n t e r r u p t e d " ) ; c l a s s StackPopper extends Thread WaitingStack stack ; public StackPopper ( WaitingStack ws ) stack = ws ; 5

stack. pop ( ) ; y i e l d ( ) ; + " i n t e r r u p t e d " ) ; public c l a s s WaitingStackDemo public static void main ( S t r i n g [ ] args ) throws Exception WaitingStack ws = new WaitingStack ( 1 0 ) ; StackPusher pu = new StackPusher ( ws ) ; StackPopper po1 = new StackPopper ( ws ) ; StackPopper po2 = new StackPopper ( ws ) ; StackPopper po3 = new StackPopper ( ws ) ; pu. s t a r t ( ) ; po1. s t a r t ( ) ; po2. s t a r t ( ) ; po3. s t a r t ( ) ; Thread. s l e e p ( 1 0 0 0 ) ; pu. i n t e r r u p t ( ) ; po1. i n t e r r u p t ( ) ; po2. i n t e r r u p t ( ) ; po3. i n t e r r u p t ( ) ; 3 Bar mleczny "Prawo dżungli" Rozważ producenta i konsumenta na przykładzie baru mlecznego wydającego posiłki wiecznie głodnym klientom. Producentem jest kucharz umieszczający dania na ladzie, konsumentami są klienci przebywający w barze. Wiecznie głodni klienci, których liczba n jest stała, konsumują wydawane potrawy na zasadzie "kto pierwszy ten lepszy". Zaimplementuj powyższy przykład przy użyciu wątków. Po zakończeniu programu wypisz ile potraw zjadł każdy z klientów. 6