Kolejnym zadaniem do zrealizowania w ramach przedmiotu "Programowanie współbieżne i rozproszone" było napisanie aplikacji wielowątkowej synchronizującej pracę barmana obsługującego klientów przy barze. Aplikacja powinna posiadać interfejs graficzny w celu wprowadzenia ilości stołków i klientów oraz wizualizacji jego działania. Realizacja zadania trwała dwa tygodnie dlatego pracę rozłożyłem na dwa etapy: tworzenie GUI oraz dobudowywanie funkcjonalności. Wykonane ćwiczenie zostało ocenione na ocenę bardzo dobrą a wynik pracy (z punktu widzenia użytkownika) można zobaczyć poniżej.
Synchronizacja wątków-klientów z wątkiem odpowiedzialnym za wizualizację została przeprowadzona poprzez połączenie klasy CountDownLatch z semaforami. Wywołanie metody await() klasy CountDownLatch zostało umieszczone przed kodem odpowiedzialnym za wyświetlenie aktualnego stanu stołków w barze. Kazdy klient po pojedyńczym wykonaniu pętli (określeniu swojego stanu, np. pije piwo lub odszedł od baru) wykonuje metodę countDown() (CountDownLatch) i acquire() (Semaphore). Metoda await() czeka tak długo aż wszyscy klienci określą swój stan, po czym w następnej kolejności wyświetlona na ekranie zostaje aktualna sytuacja mająca miejsce w barze. Przy kolejnym wykonaniu pętli obsługującej wizualizację wszystkie wątki-klienci dostają pozwolenie na dalsze działanie za pomocą metody release() (Semaphore). Funkcja barmana została zrealizowana poprzez metodę synchronizowaną zwracającą wartość logiczną - true jeżeli barman zamierza obsłużyć danego klienta oraz false w przeciwnym przypadku. Do metod synchronizowanych zalicza się również próba uzyskania miejsca przy barze, która w przypadku zajęcia stołka zwraca jego numer.
Osoby zainteresowane poznaniem większej ilości szczegółów lub porównaniem kodu powstałych aplikacji zachęcam do rozmowy - nawet podczas przerwy między zajęciami na uczelni.
wtorek, 30 marca 2010
Subskrybuj:
Komentarze do posta (Atom)
Brak komentarzy:
Prześlij komentarz