Grundlagen der Programmierung 2 SS 2005 - Datei Restaurant.java
import java.util.Random;
public class Restaurant
{ // Die Klasse Restaurant wird als Monitor realisiert.
public Restaurant(int anzTische, int minTisch, int maxTisch)
{ // Restaurant mit anzTische Tischen erzeugen, Größe für jeden
// Tisch zufällig zwischen minTisch und maxTisch wählen
rand = new Random();
tische = new Tisch[anzTische];
for (int i = 0; i < tische.length; i++)
{ int stühle = zufall(minTisch, maxTisch);
tische[i] = new Tisch(stühle);
if (stühle > größterTisch)
größterTisch = stühle;
}
}
synchronized public Tisch platzieren (int anz)
{ int n = tische.length;
System.out.println("Es wird ein Tisch mit " +
anz + " Plätzen benötigt");
while (!tischSuche(anz))
{ try { wait(); }
catch (InterruptedException e) {}
}
gefundenerTisch.hinsetzen(anz);
return gefundenerTisch;
}
synchronized public void verlassen (Tisch tisch, int anz)
{ tisch.aufstehen(anz);
notifyAll();
}
private boolean tischSuche(int anz)
{ int n = tische.length;
gefundenerTisch = null;
for (int i = 0; i < tische.length; i++)
{ // suche nach einem passenden, leeren Tisch
if (tische[i].istLeer() &&
tische[i].anzahlStühle() == anz)
{ System.out.println("Leerer Tisch mit " +
anz + " Plätzen gefunden");
gefundenerTisch = tische[i];
return true;
}
}
for (int i = 0; i < tische.length; i++)
{ // suche nach einem zu großen, leeren Tisch
if (tische[i].istLeer() &&
tische[i].nochPlatz(anz))
{ System.out.println("Größerer Tisch mit " +
anz + " Plätzen gefunden");
gefundenerTisch = tische[i];
return true;
}
}
for (int i = 0; i < tische.length; i++)
{ // suche nach einem Tisch mit ausreichend Platz
if (tische[i].nochPlatz(anz))
{ System.out.println("Tisch mit ausreichend Platz (" +
anz + ") gefunden");
gefundenerTisch = tische[i];
return true;
}
}
return false;
}
void simuliere (int anzGruppen, int minZeit, int maxZeit, int maxPause)
{ // Besuch von anzGruppen Besuchergruppen im Restaurant simulieren
// jede Gruppe benötigt zwischen minZeit und maxZeit Zeit zum Essen
// spätestens alle maxPause Zeiteinheiten kommt eine neue Gruppe
// keine Gruppe ist größer als der größte Tisch im Restaurant
for (int i = 1; i <= anzGruppen; i++)
{
BesucherGruppe g =
new BesucherGruppe(this, zufall(1, größterTisch),
zufall(minZeit, maxZeit));
g.start();
try { Thread.sleep(zufall(1, maxPause)); }
catch (InterruptedException e) {};
}
}
private int zufall(int min, int max)
{
// erzeuge Zufallszahl zwischen min und max (jeweils einschließlich)
return rand.nextInt(max - min + 1) + min;
}
private Tisch gefundenerTisch; // hier wird Gruppe platziert
private Tisch[] tische; // uns interessieren nur die Tische
private int größterTisch = 0; // max. mögliche Gruppengröße
private Random rand; // zur Erzeugung von Zufallszahlen
public static void main (String[] args)
{ // Hauptprogramm zum Testen:
// simuliert ein Restaurant mit 6 Tischen für 2 bis 10 Personen
// Simulation umfasst Besuch von 40 Gruppen im Restaurant
Restaurant r = new Restaurant(6, 2, 10);
r.simuliere(40,1000,20000,2000);
}
}
Generiert mit Camelot | Probleme mit Camelot? | Geändert am: 03.06.2005


