Tworzenie symulacji (wykorzystanie wątków)

0

Mam stworzyć aplikację symulującą pracę kas w sklepie z wizualizacją ich pracy i poruszających
się klientów.

  • Klienci przychodzą do kas i wybierają tą z nich przy której jest najmniej osób lub mają
    najmniej zakupów.
  • Klienci o wyższym priorytecie, np. osoby niepełnosprawne lub kobiety w ciąży obsługiwani
    są poza kolejnością.
  • Klienci mogą wybierać kasy wg priorytetów, np. „kasa do 10 produktów”.
  • Liczba klientów oraz ilość produktów w wózkach sklepowych generowana jest losowo.
  • Liczba kas może się zwiększać lub zmniejszać w zależności od ilości klientów.
  • Klienci po określonym czasie oczekiwania mogą zrezygnować z zakupu.
  • Aplikacja powinna umożliwiać obsługę wszystkich klientów w skończonym czasie.

Sytuacje wyjątkowe:

  • Uszkodzenie kasy (przy kasie jest kolejka, klienci przechodzą do innych kas)
  • Zmiana rolki papieru w kasie (wywołanie Thread.sleep(ileś tam) )
  • Brak kodu na produkcie (wywołanie Thread.sleep(ileś tam) )

Parametry:

  • Liczba kas otwartych domyślnie i wszystkich kas w sklepie (przyjmuje ze maksymalnie jest 6 kas)
  • Rodzaj każdej z kas
  • Maksymalna ilość klientów i produktów w wózku
  • Czas potrzebny na zarejestrowanie w kasie jednego towaru (stała dla wszystkich)
  • Czas, po którym klienci rezygnują z zakupów
  • Rodzaje priorytetów klientów

Mam pytanie, jak się do tego zabrać, jak zamodelować kolejki przy kasach, aby wszystkie wątki oprócz tego który jest pierwszy czekały przy poszczególnych kasach? czytałem trochę o kolejkach blokujących BlockingQueue<> ale nie wiem czy powinienem tego używać. Jak powinny się komunikować ze sobą te wątki? Jakich obiektów powinienem użyć?
Byłbym bardzo wdzięczny za wszystkie wskazówki i podpowiedzi w stworzeniu takiej aplikacji? Nigdy nie pisałem wielowątkowej aplikacji i mam problem ze stworzeniem takiej symulacji :-(

0

może ułatwi Ci trochę fakt, że (przynajmniej wnioskując po treści) klienci nie muszą być wątkami.
Wątkami są kasy. Klienci są obiektami. Klient posiada zakupy, na podstawie których wyliczany jest czas jaki spędzi klient przy kasie (na taki czas należy wątek danej kasy uśpić). Po wyliczeniu do której kasy chce klient podejść dodajemy tego klienta do listy obiektów(klientów) danej kasy.

Jak się zabrać do wątków kas?

Stwórz klasę implementującą interfejs Runnable, w niej zaimplementuj metodę : public void run().
Następnie twórz wątki od obiektów tej klasy - dzięki temu uzyskasz równoległość działania kas.

0

dzięki pm#. mam jeszcze pytania:

  1. jak mogę wywołać jakąś nie statyczną metodę dla wszystkich wystartowanych wątków kas żeby zwróciły mi wartość (w tym przypadku ilość klientów przy kasie)? czy mam stworzyć jakiąś statyczną tablicę klasy Kasa

public static Kasa[] tab;

i przy każdym startowaniu wątku (a może lepiej obiektu?) dodawać do tej tablicy

public Kasa(int i) {
this.nrKasy = i;
Kasa.tab[i] = this;
}

a potem z obiektu Klient wywoływać funkcję szukajKasy() i tam odwoływać się do statycznej tablicy kas
czy może stworzyć obiekt ThreadGroup, wątki kas dodawać do tej grupy
i za pomocą enumerate(Thread[] list) pobierać referencje do wszystkich obiektów kas?
Tylko chyba tablica list zwraca referencje do wątków, a nie za bardzo wiem czy można otrzymać referencję do obiektu Kasa który implementuję interfejs Runnable jeśli mam referencję do wątku.
No bo chyba nic mi nie da wywołanie jakiejś funkcji dotyczącej stanu Kasy dla wątku (no chyba że chcę zrobić coś z wątkiem ale mi chodzi o liczbę klientów znajdującą się w tablicy konkretnej instancji obiektu Kasa)?

  1. Tak poza tym jaką strukturę powinienem użyć do trzymania referencji dla obiektów Klient (klientów danej kasy), czy ma to być zwykła tablica typu Klient[] tabKlientow czy jakaś inna konstrukcja?

1 użytkowników online, w tym zalogowanych: 0, gości: 1