Kleines Spiel realisieren - wie?

Trunk

Mitglied
Hallo,

ich stehe zurzeit vor folgendem Problem und weiß nicht so recht wie ich es realisieren könnte..

In einer kleinen "Restaurant-Simulation" bestellen Gäste bei einem Kellner zB einen Kaffee, dieser gibt den Auftrag an die Küche weiter usw...
Nun bestellt der Gast etwas über eine Methode, und in der Methode "Bestellung aufnehmen" des Kellners bekommt dieser den Auftrag und gibt ihn weiter.

Nun das Problem :

Ich möchte dass der Kellner eine gewisse Zeit für das Übergeben benötigt, und wollte dies erst mit einem sleep() umsetzten, da jedoch mehrere Kellner gleichzeitig verschiedene Gäste bedienen sollen geht das aber nicht...

Von Threads habe ich schon etwas gehört, nur verstehe ich nicht wie ich diese hier anweden kann (die Kellner Klasse "extends Thread"?!) und frage mich ob es nicht eine einfachere Lösung gibt...

Die Klasse Gast:

Java:
public class Gast
{
    public int Tischnummer;
    public boolean bestellung_erhalten=false;
    public CoffeShop c;

    public Gast(CoffeShop cs, Integer t)
    {
        c = cs;
        Tischnummer = t+1;
    }

    public Integer getTischnummer()
    {
        return Tischnummer;
    }


    public void kellnerRufen (String Artikel, Integer Menge)
    {
        Kellner bedienung = c.getKellner();

        Bestellung order = new Bestellung(this);

        if (Artikel.equals("Kaffee"))
        {
            order.bestellungErweitern("Kaffe",Menge);
            System.out.println("Ein Gast (Tisch "+Tischnummer+") hat kaffe bei " + bedienung.getName() + " bestellt");
        }

        bedienung.bestellungEntgegennehmen(order);
    }

}

Die Klasse Kellner:

Java:
public class Kellner {

    public String Name;
    public boolean Beschaeftigt = false;
    public Bestellung AktuelleBestellung;
    public CoffeShop c;

    public Kellner(CoffeShop cs, String n)
    {
        c = cs;
        Name = n;
    }

    public String getName()
    {
        return Name;
    }

    public boolean istBeschaeftigt()
    {
        return Beschaeftigt;
    }


    public void bestellungEntgegennehmen(Bestellung b)
    {
        AktuelleBestellung = b;
        Beschaeftigt= true;


        System.out.println(Name + " nimmt Bestellung entgegen...");

//Hier soll er eine gewisse Zeit warten(/brauchen)


        System.out.println(Name + " hat die Bestellung erhalten...");

//Hier ebenfalls

        c.bestellungHinzufügen(b);
        System.out.println(Name + " hat die Bestellung weitergeleitet");

//Hier ebenfalls

        Beschaeftigt = false;


    }
}

Ich hoffe jemand kann mir hierbei weiterhelfen..
Liebe Grüße
 
Stichwort:

Threads

Thread.currentThread().sleep();

generell sleep();

Aber da muss man genau hinschauen, da Kellner und Gast ein anderer Thread sein muss.
 
Hier kleines Beispiel
(Wäre besser wen main in einer anderen Klasse ist)

Java:
public class MyThread extends Thread{
	
	private String message;

	public MyThread(String message) {
		this.message = message;
	}
	
	@Override
	public void run () {
		for (int i = 0; i < 10 ; i++) {
			System.out.println(message);
			try {
				Thread.sleep((long)(Math.random() * 1000)  ); // sleep in zufallslänge
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
public static void main(String[] args) throws Exception{
		
		MyThread eins= new MyThread("eins!");
		MyThread zwei= new MyThread("zwei!");
		MyThread drei= new MyThread("drei!");
		MyThread vier= new MyThread("vier!");
		
		eins.start();
		zwei.start();
		drei.start();
		drei.join();	// wartet bis drei fertig ist bevor nächstes kommt
		vier.start();

	}

}
 
Stichwort:

Threads

Thread.currentThread().sleep();

generell sleep();

Aber da muss man genau hinschauen, da Kellner und Gast ein anderer Thread sein muss.


Okay, dachte ich mir schon, nur wie kann ich das umsetzen? Hab mir schon einiges darüber durchgelsen aber ich weiß nicht wie ich das mit der "run()" methode auf zB den Kellner anwenden soll..


Hier kleines Beispiel
(Wäre besser wen main in einer anderen Klasse ist)

Java:
public class MyThread extends Thread{
	
	private String message;

	public MyThread(String message) {
		this.message = message;
	}
	
	@Override
	public void run () {
		for (int i = 0; i < 10 ; i++) {
			System.out.println(message);
			try {
				Thread.sleep((long)(Math.random() * 1000)  ); // sleep in zufallslänge
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
public static void main(String[] args) throws Exception{
		
		MyThread eins= new MyThread("eins!");
		MyThread zwei= new MyThread("zwei!");
		MyThread drei= new MyThread("drei!");
		MyThread vier= new MyThread("vier!");
		
		eins.start();
		zwei.start();
		drei.start();
		drei.join();	// wartet bis drei fertig ist bevor nächstes kommt
		vier.start();

	}

}

Das habe ich verstanden, aber ich verstehe nicht wie ich das auf mein Beispiel anwenden kann? Der Kellner zB soll ja mehr dinge als nur "run" können?!
 
Zuletzt bearbeitet:
Wie bereits geschrieben worden ist, müsstest du den Thread zum steuern des Kellerns benutzen.

Oder des Kellners und des Kunden.

Der Thread macht in der run() methode

Gast.gibtBestellung()

sleep(1000) // 1 Sekunde

Kellner.gibtBestellunganKüche();

Gruß,

Martin
 
Die run-methode der Kellner könnte zum Bleistift so aussehen:
Java:
@Override
public void run(){
	while(coffeShop.isOpen()) {
        Queue<Task> taskList = coffeShop.getTaskList();
		if(!taskList.isEmpty()) { //guck obs was zu tun gibt
			task = taskList.poll(); //hol nen neuen auftrag aus der Queue
			task.execute(Waiter.this); //mach das und sleep entsprechend lange
		} else {
			sleep(100); // mach ein nickerchen bis was zu tun ist
		}
	}
}}

Wenn ein Gast eine Bestellung aufgibt oder bezahlen will, wird diese als Task in einer Queue gespeichert und die Kellner gucken einfach immer obs grad was zu tun gibt, wenn ja machen sie dass und brauchen dafür ne bestimmte zeit ansosnten pennen sie ne runde

Fehlt nur noch die Klasse Task, aber ich muss jetzt arbeiten vllt. nachher 😉

edit:
Tasks könnte man dann so darstellen:
Java:
interface Task {
	
	int getDuration();
	void execute();
}

class Order implements Task {
	
	private int duration;
	private String name;
	
	public Order(Guest guest, String name, int duration) {
		this.name = name;
		this.duration = duration;
	}
	
	public int getDuration() {
		return duration;
	}
	
	public execute(Waiter w) {
		w.bringOrderToKitchen(name, guest);
		sleep(duration);
	}
}
 
Zuletzt bearbeitet:

Zurück
Oben