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