kuhlmaehn
Erfahrenes Mitglied
Hi, ich muss gerade das Dining Philosophers Problem programmieren und dazu findet man ja auch jede Menge, allerdings wollt ich das mal selber schaffen und es klappt aber leider gerade gar nicht und ich hoffe jemand kann mir da gerade mal helfen.
Das hier ist der Monitor der das eigentlich regeln soll:
Die Philosophen werden in einer anderen Klasse erzeugt und dann übergeben. Das eigentliche Problem ist, dass sobald ein Philosoph in getforks auf philosophen[id].wait() stößt der Monitor nicht freigegeben wird. Es kann weder einer weiterer Philosoph in getforks noch in putforks.
Das müsste doch aber eigentlich klappen oder warum nicht?
Bin für jede Hilfe dankbar
Das hier ist der Monitor der das eigentlich regeln soll:
Code:
public class Monitor {
final int anzGabeln;
final int anzPhilosophen;
boolean[] gabeln;
Philosoph[] philosophen;
Monitor(Philosoph[] phil, int anzG, int anzP) {
this.anzGabeln = anzG;
this.anzPhilosophen = anzP;
this.philosophen = phil;
gabeln = new boolean[anzGabeln];
for (int n=0; n<anzGabeln; n++) {
gabeln[n] = true;
}
}
synchronized void getforks(int id) {
boolean gr=false;
boolean gl=false;
System.out.println("Philosoph " + id + " will rechte!");
while(!gr) {
int grechts = id;
if (gabeln[grechts]) {
gabeln[grechts] = false;
gr=true;
}
else {
try {
philosophen[id].wait();
}
catch (Exception e) {
}
}
}
System.out.println("Philosoph " + id + " will linke!");
while(!gl) {
int glinks = (id+1)%5;
if (gabeln[glinks]) {
gabeln[glinks] = false;
gl=true;
}
else {
try {
philosophen[id].wait();
}
catch (Exception e) {
}
}
}
}
synchronized void putforks(int id) {
int glinks = (id+1)%5;
gabeln[glinks] = true;
int grechts = id;
gabeln[grechts] = true;
System.out.println(id + " hat hingelet");
notify();
}
}
Das müsste doch aber eigentlich klappen oder warum nicht?
Bin für jede Hilfe dankbar
Zuletzt bearbeitet: