Ich habe 3 Klassen. Ein Kellner (Thread), eine Tabelle (Thread) und eine Warteschlange (kein Thread) (einfaches first in first out queue).
Zunächst werden ein paar Kellner und dann Tische erstellt. Es gibt viel mehr Tische als Kellner, so dass die Tische auf die Kellner "warten" müssen, um sie zu bedienen. Ich soll "Java-Synchronisierungsprimitive, wait notify und notifall" verwenden, um dieses Problem zu lösen. Hier sind die Richtlinien für jede Klasse:
Tisch: Wenn sie gestartet wird, tritt sie in die Warteschlange ein und ruft dann eine interne Methode waitService() auf, die zurückgibt, ob sie bedient wurde oder auf einen Kellner wartet.
so wie ich diese Methode im Moment habe:
$if(serviced)
return 0;
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Kellner: Der Kellner-Code ist nicht wirklich geben mir keine Probleme, aber im Wesentlichen die Art und Weise, wie es funktioniert, ist, dass in der Run-Methode gibt es eine Endlosschleife, die prüft, ob es einen Tisch wartet und dann gibt, dass Tabelle Service für eine zufällige Menge an Zeit, nach der es prüft, ob ein anderer Tisch wartet. Die Tabelle wird durch den Aufruf der giveService()-Methode innerhalb der Table-Klasse darüber informiert, dass sie bedient wird.
Warteschlange: Sie hat eine Liste von Kellnern und eine Liste von Tischen. Der Kellner ruft nextTable() in der Warteschlangenklasse auf, wenn er bereit ist, Service zu geben. so habe ich es eingerichtet:
$public Table nextTable(Waiter w) throws InterruptedException {
if(closed)
return null;
if(tables.isEmpty()) {
w.wait();
}
Table t = tables.removeFirst();
t.notify();
return t;
}
Ich weiß, die oben kann einige sehr grundlegende Fehler haben, aber im Wesentlichen habe ich keine Ahnung, wie Synchronisation Primitive in Java arbeiten. Jede Hilfe würde geschätzt werden.