[JavaSE] oczekiwanie w main na zakończenie innych wątków

0

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.

0

aby dany wątek zaczekał na zakończenie innrgo wątka trzeba wywołać metodę join().
Jeśli uruchomisz wątek np t1, to aby metoda main zaczekała na jego zakończenie musisz dodać w niej linię
t1.join();

Myślę, że join() można też z powodzeniem zastosować w mechaniźmie przerywania pracy fabryki - po prostu wątek fabryki musi zaczekać, aż wątki stanowisk się zakończą (czyli jak taśmy będą puste)

0

Dzięki poczytam, Pozdrawiam

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