• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kolejka blokująca ArrayBlockingQueue, Wątki, Java - pomoc

Object Storage Arubacloud
0 głosów
711 wizyt
pytanie zadane 9 maja 2020 w Java przez dan98 Nowicjusz (120 p.)

Jestem studentem informatyki i na zajęcia mam takie zadanie do zrobienia:

W fabryce ciastek pracują cukiernicy i pakowacze (osobne wątki). Zadaniem cukiernika jest wyprodukowanie ciastka, a pakowacza zapakowanie ciastka do kartonu. Każde ciastko jest takie samo, reprezentowane jako wartość liczbową typu Integer. Każde ciastko trafia na taśmę produkcyjną. Z taśmy pojedynczo zbiera je pakowacz. Taśma produkcyjna mieści jednocześnie N ciastek. Jeżeli pakowacze zbyt wolno pakują, cukiernicy muszą spowolnić lub zatrzymać swoją pracę. Jeśli pakowacze pakują szybciej niż cukiernicy produkują, wówczas pakowacze oczekują. Napisz program symulujący działanie fabryki. Wprowadzaj opóźnienia pracy cukiernika i pakowacza, wyświetlaj stosowne komunikaty. Wykorzystaj kolejkę blokującą ArrayBlockingQueue oraz metody put(), take(). 

Udało mi się napisać większość kodu ale mam następujący problem:

Chciałbym aby w momencie użycia funkcji take() i put() była wyświetlana informacja na zasadzie: System.out.println(currentThread().getName() + " zdjął ciastko ");
Niestety nie wiem jak zsynchronizować to aby współpracowało z wątkami, aktualnie otrzymuje mniej więcej taki rezultat:

Pakowacz#2 zdjął ciastko
Pakowacz#1 zdjął ciastko
Cukiernik#0 umieścił ciastko
#Pakowacz#0 zdjął ciastko
Cukiernik#2 umieścił ciastko
Cukiernik#1 umieścił ciastko

Podaję jeszcze okrojony kod dla klasy Pakowacza:

public class Pakowacz {

private BlockingQueue<Integer> queue;

public Pakowacz(BlockingQueue<Integer> queue) {
    this.queue = this.queue;
}
    public void run() {
        while (true) {
            try {
                queue.take();
                System.out.println(this.getName() + " zdjął ciastko ");
                currentThread().getName();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
}
}

 

1 odpowiedź

0 głosów
odpowiedź 9 maja 2020 przez mbabane Szeryf (79,280 p.)

Wyświetl przed i po tzn:

System.out.println(this.getName() + " zdjął ciastko "); 
queue.take();
System.out.println(this.getName() + " zdjął ciastko ");

Będziesz miał wtedy pełną informacje.

Pamiętaj, że pracujesz na wielu wątkach, więc wynik programu nie będzie za każdym uruchomieniem taki sam.

Podobne pytania

0 głosów
1 odpowiedź 190 wizyt
pytanie zadane 8 lutego 2019 w Java przez mn130496 Gaduła (3,530 p.)
0 głosów
1 odpowiedź 330 wizyt
pytanie zadane 15 kwietnia 2019 w Java przez mn130496 Gaduła (3,530 p.)
0 głosów
1 odpowiedź 296 wizyt
pytanie zadane 14 stycznia 2018 w Java przez nik Obywatel (1,640 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...