Dzięki za odpowiedź.
Komercyjne? To żadna komercja. To zadanie ze studiów jest, oparłem je na połączenie kilku programów z TIJ, gdzie przykłady są znakomite i może dlatego tak wygląda.
A kod cały wrzuciłem tylko dlatego żeby każdy mógł zobaczyć jak działa, jeśli będzie chciał.
W każdym razie zmieniłem trochę program i już prawie wszystko działa, ale mam problem z wykończeniem programu.
Program działa przez jakiś czas, po upływie danego czasu brama wjazdowa zostaje zamknięta. No ale jeśli w kolejkach do poszczególnych stacji są auta no to trzeba poczekać aż wszystkie wyjadą i wtedy wątki są zabijane i pokazywany jest komunikat że stanowisko zostało zamknięte (w przechwyceniu InterruptedException)
Samo sprawdzenie stanu kolejek działa, z tym że jeśli właśnie jest obsługiwany jakiś pojazd, może dojść do sytuacji, że w kolejce już nic nie ma i zostanie pokazany komunikat:
Stanowisko X rozpoczęło mycie pojazdu Y
Stanowisko X zostało zamknięte.
A więc tak jakby pojazd będzie myty na zawsze, chciałem to zmienić więc dodałem jeszcze jedną flagę
inUse. Kod klasy bazowej dla stanowisk poniżej:
Kopiuj
public abstract class Station implements Runnable {
protected LinkedBlockingQueue<Vehicle> vehicles
= new LinkedBlockingQueue<Vehicle>();
protected MyDialog view;
protected MyDialog exit;
private boolean inUse = false;
public synchronized void setStatus(boolean status) {
this.inUse = status;
}
public synchronized boolean isInUse() {
return this.inUse;
}
public Station(MyDialog panel, MyDialog exit) {
this.view = panel;
this.exit = exit;
}
public synchronized void addVehicle(Vehicle v) {
if (this.vehicles.size() < 15) {
this.vehicles.add(v);
}
else {
this.view.append("W kolejce czeka 15 samochodów, nie ma więcej miejsc.");
this.exit.append(v + " opuszcza myjnię.");
}
}
public synchronized boolean areAnyCarsAwaits() {
return this.vehicles.size() > 0 || this.isInUse();
}
public void run() {
this.view.append("Stanowisko zostało otwarte.");
try {
while(! Thread.interrupted()) {
this.setStatus(true);
this.serve();
this.setStatus(false);
}
} catch(InterruptedException ex) {
this.view.append("Stanowisko zostało zamknięte.");
}
}
protected abstract void serve() throws InterruptedException;
}
Metodą areAnyCarsAwaits() sprawdzam czy można bezpiecznie zamknąć stanowisko, jednak do tego nie dochodzi. Gdy kolejka jest pusta debug pokazuje ze inUse jest zawsze true, więc wątek nigdy nie zostaje zabity, a ja nie otrzymuje na wyjście komunikatu "Stanowisko zostało zamknięte."
Przykładowa implementacja metody serve() wygląda tak, ale chyba to nie ma w tym nic do gadania:
Kopiuj
protected void serve() throws InterruptedException {
Vehicle v = this.vehicles.take();
this.view.append("Sprzątanie " + v + " w toku...");
TimeUnit.SECONDS.sleep(3);
this.view.append("Sprzątanie " + v + " zostało zakończone.");
v.doCleaning();
if (v.washed() && v.cleaned() && v.polished()) {
this.exit.append(v + " opuszcza myjnię...");
}
}
Doradzi ktoś?
Pozdrawiam