Witam
Mam program, symulację działania fabryki.
Pierwszym problemem jest jej prawidłowe kończenie, robię to tak w main():
public static void main(String[] args) throws InterruptedException {
Fabryka f = new Fabryka();
TimeUnit.MINUTES.sleep(1);
fabryka.przerwijPracę();
while(! fabryka.czyZamknięta()) {
}
System.exit(0);
}
Jakie są prawidłowe sposoby czekania na zakończenie innych wątków w main()?
Druga sprawa to sama metoda przerwijPracę();
public void przerwijPracę() {
taśma.wstrzymaj();
exec.shutdownNow();
pokażLiczbęOczekującychNaPomalowanie();
zamknięta = true;
}
Tu problem jest taki, że w każdym ze stanowisk (jest to zwykła klasa zadaniowa implementujące Runnable) mam kolekcję (LinkedBLockingQueue) z autami pobranych przez to stanowisko z tej taśmy. Jedno stanowisko wkłada silnik, inne lakieruje itd. Chciałbym żeby ta metoda poczekała aż ta kolekcja będzie pusta (w każdym ze stanowik) i wtedy zrobić exec.shutdownNow(), ale nie mogę dojść jak to zrobić.
Metoda pokażLiczbęOczekującychNaPomalowanie(); pokazuje mi że w kolejkach ze stanowisk dalej pozostają auta pobrane z taśmy, a nie chcę żeby tak było.
Właściwe do stanowisk "wstrzykuje" auta z taśmy (taśma co jakiś czas generuje kilka aut, czy tam szkieletów aut) sama klasa fabryki pobierając je najpierw z taśmy:
run() z fabryki():
public void run() {
while(! czyZamknięta()) {
if (taśma.czyWstrzymana() == false) {
try {
Samochód s = taśma.pobierz();
Status status = s.pobierzStatus();
if (status == Status.SPAWANIE) {
stanowiskoSpawajace.dodajSamochód(s);
} else if (status == Status.MONTAŻ_SILNIKA) {
stanowiskoMontujące.dodajSamochód(s);
} else if (pakiet == Status.LAKIEROWANIE) {
stanowiskoLakierujące.dodajSamochód(s);
}
} catch (InterruptedException ex) {
}
}
}
}
Proszę o pomoc.