Dziękuję wszystkim za uwagi. Były pomocne. Dążyłem do zrobienia zadania o poniższej treści. Jestem ciekaw czy wygląda to już lepiej? Pojawiły się też nowe problemy.
Wyciąg narciarski o pewnej ładowności N
Klienci posiadają ciężar (losowa wartość Ki) i są wątkami wykonującymi w
pętli:
- zjazd (sleep(duża losowa wartość))
- próbują wjechać wyciągiem (jeśli suma ciężaru wciąganych klientów jest
mniejszą bądź równa N),
- jeśli nie udaje się to czekają (sleep(niewielka losowa wartość) i
ponownie wykonują poprzedni punkt
- jeśli się udaje dostać to wjeżdżają wyciągiem (sleep(stała wartość dla
wszystkich klientów))
Oto efekt:
public class Klient extends Thread
{
private Wyciąg wyciąg;
private int waga;
private int id=0;
private static int NextId=1;
public Klient(Wyciąg awyciąg, int w)
{
this.wyciąg = awyciąg;
this.waga=w;
}
public int getWaga()
{
return waga;
}
public void run()
{
for (int i =0; i<10; i++)
{
wyciąg.zjazd(this);
wyciąg.wejście(this);
wyciąg.wjazd(this);
wyciąg.zejscie(this);
}
}
}
public class Wyciąg
{
private static int zaladowanie=0;
private static final int max_zaladowanie=60;
synchronized public void wejście(Klient klient)
{
try
{
System.out.println("Klient " + klient.getName() + " Próbuję wejść na wyciąg");
while (zaladowanie>max_zaladowanie)
{
System.out.println("Wyciąg pełny - czekaj!");
klient.sleep((long) Math.random()*1000);
wait();
}
}
catch (InterruptedException e) {}
System.out.println("Klient " + klient.getId() + "wszedl na wyciąg");
zaladowanie+=klient.getWaga();
System.out.println("Zaladowanie = " + zaladowanie);
}
synchronized public void zejscie (Klient klient)
{
System.out.println("Klient "+ klient.getId() + " Schodzi z wyciągu");
zaladowanie-=klient.getWaga();
System.out.println("Aktualne zaladowanie = " + zaladowanie);
notify();
}
public void zjazd(Klient klient)
{
System.out.println("Klient nr: " + klient.getId()+ "Zjezdza z górki");
try
{
klient.sleep((long) Math.random()*5000);
}
catch (InterruptedException e){}
}
public void wjazd(Klient klient)
{
try
{
klient.sleep(10000);
}
catch (InterruptedException e){e.printStackTrace();}
}
}
Zadanie jeszcze nie jest skończone ponieważ trafiłem na kolejne problemy:
- Jeśli wyciąg jest przeciążony i kilka wątków czeka na wejście, Jak zrobić tak by pierwszy wszedł ten, który pierwszy podjął taką próbę? (Jak w kolejce, kto pierwszy się ustawił, pierwszy wchodzi)
- Nie potrafię spełnić 3 punktu zadania
iii. jeśli nie udaje się to czekają (sleep(niewielka losowa wartość) i ponownie wykonują poprzedni punkt
W moim przypadku jest tak, że wątek podejmuje tylko jedną nieudaną próbę i nie podejmuje kolejnych, tylko czeka, aż inny wątek opuści wyciąg.
- Nie do końca potrafię zrozumieć koncepcji monitora. Co jest u mnie monitorem , o ile w ogóle jest?
Z góry dziękuję :)