Mam problem z odpowiednim zarządzaniem czasem działania wątków. Chcę, żeby wykonywały się one przez określony przeze mnie czas i jeśli pewien warunek nie zostanie spełniony aby były zamykane. W przypadku gdyby warunek został spełniony chciałbym aby czas życia wątku leciał od nowa. Na razie mam coś takiego:
public Klient(int id, long czas_zycia, Cukiernia cukiernia) {
this.id = id;
this.czas_zycia = czas_zycia;
this.cukiernia = cukiernia;
timer=new Timer();
timer.schedule(new TimerTask()
{
@Override
public void run() {
// TODO Auto-generated method stub
czy_zyje=false;
System.out.println("-------------Zmiana boolena---------------");
}
}, 1*1000);
}
Powyżej w konstruktorze wątku tworzę sobie Timer, który po określonym czasie zmienia mi booleana w oparciu o który działa sam wątek:
@Override
public void run() {
long obecny_czas=System.currentTimeMillis();
long koniec_zycia=czas_zycia+obecny_czas;
//while(System.currentTimeMillis() < koniec_zycia) {
while (czy_zyje) {
try {
long czas_spaceru=(long)(Math.random()*0.2*4000)+ System.currentTimeMillis();
while(System.currentTimeMillis() < czas_spaceru) {
System.out.println("Klient o nr: " + this.id + " spaceruje");
try {
Thread.sleep(500);
} catch(Exception e) {
}
}
if (czy_zyje==false) {
break;
}
if ((!cukiernia.kolejka1.contains(this)) && (!cukiernia.kolejka2.contains(this))) {
cukiernia.dodajKlientaDoKolejki(this);
}
if (czy_zyje==false) {
break;
}
try {
long time = (long) (Math.random() * 100);
Thread.sleep(time*1000);
} catch (Exception e) {
}
if (czy_zyje==false) {
break;
}
try {
if((cukiernia.kolejka1.contains(this)) || (cukiernia.kolejka2.contains(this))) {
if ((cukiernia.kolejka1.element()==this) || (cukiernia.kolejka2.element()==this)) {
zakupPaczka();
cukiernia.usunKlientaZKolejki(this);
}}
} catch(Exception e) {
System.out.println("aaaaaaaa");
}
if (czy_zyje==false) {
break;
}
try {
long time = (long) (Math.random() * 100);
Thread.sleep(time*1000);
} catch (Exception e) {
}
} finally {
System.out.println("Klient nr: " + this.id + " umarl z braku paczkow");
}
}
}
Problem w tym, że ewentualna zmiana zostaje wychwycona dopiero po całym pierwszym przebiegu pętli. Nawalenie ifów i breaków połowicznie pomaga, ale zdaję sobie sprawę, że najprawdopodobniej jest to tragiczne rozwiązanie. Czy ktoś mógłby mi zaproponować ładniejsze i bardziej przejrzyste rozwiązanie?
Pozdrawiam