Folgende Aufgabenstellung:
In dieser Aufgabe soll die Zugangskontrolle für eine Sauna simuliert werden. Es gelten folgende Bedingungen:
• Die Sauna ist sehr groß. Sie kann beliebig viele Leute gleichzeitig aufnehmen.
• Die Sauna soll nur getrennt geschlechtlich genutzt werden, d.h., es dürfen sich nicht gleichzeitig Männer und
Frauen in der Sauna aufhalten.
• Es gibt keine festen Frauen- oder Männerzeiten. Die erste Person welche die Sauna betritt „sperrt“ sie für das
andere Geschlecht, bis die Sauna wieder komplett unbesetzt ist.
• Wenn bereits eine Person eines Geschlechts in der Sauna ist, dürfen weitere Personen desselben Geschlechts
dazu kommen.
Schreiben Sie ein Programm, das in zufälligen Zeitabständen Personen-Objekte eines zufälligen Geschlechts erzeugt,
die eine zufällig lange Zeit die Sauna benutzen wollen, und das die Wartesituation vor der Sauna und Verweilsituation
in der Sauna durch geeignete Ausgaben simuliert.
Bemerkung: Bei ungünstiger Wahl der der zufälligen Parameter kann es sein, dass es nie zu einen Wechsel zwischen
Frauen und Männern kommt. Variieren Sie die Parameter. Wie man eine solche Situation allgemein verhindern kann
lernen Sie in Kapitel 7 der Vorlesung
Meine Lösung:
Meine Frage:
Wenn ich mein Programm laufen lasse, dann kommts gerade zu dem Dead-Lock, also es kommt zu keinem Wechsel zwischen den Männern und Frauen.
Woran liegt das?
Würd ich das Dead-Lock Problem ignorieren wäre die Aufgabe denn so richtig gelöst, wenn ich Dead-Locks zulasse, oder ist da irgendwo ein Fehler, weil ich nicht weiß woran ich erkenne ob ich richtig programmiert habe oder nicht, da ich nicht weiß worauf man beim Testen von Threads und Synchronisationen achten muss um Aussagen zu können ob man richtig an die Aufgabe ran gegangen ist.
Ich hoff ihr könnt mir helfen und etwas zu meinem Programm sagen.
In dieser Aufgabe soll die Zugangskontrolle für eine Sauna simuliert werden. Es gelten folgende Bedingungen:
• Die Sauna ist sehr groß. Sie kann beliebig viele Leute gleichzeitig aufnehmen.
• Die Sauna soll nur getrennt geschlechtlich genutzt werden, d.h., es dürfen sich nicht gleichzeitig Männer und
Frauen in der Sauna aufhalten.
• Es gibt keine festen Frauen- oder Männerzeiten. Die erste Person welche die Sauna betritt „sperrt“ sie für das
andere Geschlecht, bis die Sauna wieder komplett unbesetzt ist.
• Wenn bereits eine Person eines Geschlechts in der Sauna ist, dürfen weitere Personen desselben Geschlechts
dazu kommen.
Schreiben Sie ein Programm, das in zufälligen Zeitabständen Personen-Objekte eines zufälligen Geschlechts erzeugt,
die eine zufällig lange Zeit die Sauna benutzen wollen, und das die Wartesituation vor der Sauna und Verweilsituation
in der Sauna durch geeignete Ausgaben simuliert.
Bemerkung: Bei ungünstiger Wahl der der zufälligen Parameter kann es sein, dass es nie zu einen Wechsel zwischen
Frauen und Männern kommt. Variieren Sie die Parameter. Wie man eine solche Situation allgemein verhindern kann
lernen Sie in Kapitel 7 der Vorlesung
Meine Lösung:
Java:
public class SaunaMonitor
{
private int personenanzahl;
private String geschlecht;
public synchronized void goIn(Person gast)
{
System.out.println("Eintritt von Gast Nr.: " + gast.getBesuchernummer() + " Geschlecht: " + gast.getGeschlecht() + " Wartezeit "
+ gast.getWartezeit() + " Verweilzeit " + gast.getVerweilzeit());
if(personenanzahl == 0)
{
this.geschlecht = gast.getGeschlecht();
}
while( !(this.geschlecht.equals(gast.getGeschlecht())) )
{
if(gast.getWartezeit() >= 0)
gast.decrWartezeit();
else System.out.println("Gast Nr. " + gast.getBesuchernummer() + "wollte nicht mehr warten Geschlecht: " + gast.getGeschlecht() + " Wartezeit "
+ gast.getWartezeit() + " Verweilzeit " + gast.getVerweilzeit());
try
{
wait();
}
catch(InterruptedException e){}
}
if(gast.getWartezeit() >= 0)
personenanzahl++;
}
public synchronized void goOut(Person gast)
{
System.out.println("Verlassen von Gast Nr.: " + gast.getBesuchernummer() + " Geschlecht: " + gast.getGeschlecht() + " Wartezeit "
+ gast.getWartezeit() + " Verweilzeit " + gast.getVerweilzeit());
personenanzahl--;
notifyAll();
}
}
public class Person extends Thread
{
private SaunaMonitor sauna;
private String geschlecht;
private int verweilzeit;
private int wartezeit;
private int besuchernummer;
public Person(SaunaMonitor sauna, int besuchernummer)
{
if((int)(Math.random()*10+1) > 5)
this.geschlecht = "w";
else
this.geschlecht = "m";
this.verweilzeit = (int)(Math.random()*1000+1);
this.wartezeit = (int)(Math.random()*3000+1);
this.sauna = sauna;
this.besuchernummer = besuchernummer;
}
public void run()
{
sauna.goIn(this);
try
{
sleep(verweilzeit);
}
catch(InterruptedException e){}
sauna.goOut(this);
}
public String getGeschlecht(){return geschlecht;}
public int getVerweilzeit(){return verweilzeit;}
public int getWartezeit(){return wartezeit;}
public int getBesuchernummer(){return besuchernummer;}
public void decrWartezeit(){wartezeit = wartezeit - 500;}
}
public class Zugangskontrolle
{
public static void main(String[] args)
{
SaunaMonitor sauna = new SaunaMonitor();
int besucheranzahl = (int)(Math.random()*20+1);
System.out.println("Kontrollausgabe(Besucheranzahl): " + besucheranzahl);
for(int i = 1; i <= besucheranzahl; i++)
{
new Person(sauna, i).start();
}
}
}
Meine Frage:
Wenn ich mein Programm laufen lasse, dann kommts gerade zu dem Dead-Lock, also es kommt zu keinem Wechsel zwischen den Männern und Frauen.
Woran liegt das?
Würd ich das Dead-Lock Problem ignorieren wäre die Aufgabe denn so richtig gelöst, wenn ich Dead-Locks zulasse, oder ist da irgendwo ein Fehler, weil ich nicht weiß woran ich erkenne ob ich richtig programmiert habe oder nicht, da ich nicht weiß worauf man beim Testen von Threads und Synchronisationen achten muss um Aussagen zu können ob man richtig an die Aufgabe ran gegangen ist.
Ich hoff ihr könnt mir helfen und etwas zu meinem Programm sagen.