Threads Condition und Signal/SignalAll

Ogjim

Neues Mitglied
Guten Tag,

habe leider ein kleines Problem mit Signal/SignalAll.

Folgender Sachverhalt. Es gibt 5 Personen (in diesem Fall Philosophen), diese sitzen an einen Tisch. Während einer isst, dürfen sein Kollegen nicht essen und diese denken demnach. Sobald einer fertig gegessen hat, denkt dieser und signalisiert es seinen Kollegen(die die denken).

Vorgegeben war ein Table (ist vom Typ Lock).

Meine Denkweise war jetzt, eine Condition zu erstellen, welche sobald einer der Kollegen nebenan isst, wartet und sobald diese fertig sind benachrichtigt wird. Es kommen aber immer eine Fehlermeldung und meist(so gut wie immer) essen die beiden gleichen Philosophen.

private Philosopher right;
private Philosopher left;
static private Lock table;
private volatile boolean essen = false;
private int sitzplatz;
private String name= "";
volatile static int zaehler;
Condition stopper;
boolean aufhören = true;

Philosopher(){
name = name +zaehler++;
}

public void run () {
while(aufhören==true) {
try {
aktion(); //entweder denken oder essen
} catch (InterruptedException e1) {
e1.printStackTrace();
}
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
void aktion() throws InterruptedException {
this.table.lock();
try {
while(this.right.isEssen()== true || this.left.isEssen() == true) {
System.out.println("Ich denke: " + this.name);
this.essen = false;
this.stopper.await(); //hier würde der Thread warten, wenn einer von beiden isst
}

}
finally {
this.essen = true;
System.out.println("YumYum "+ this.name); //er isst
right.stopper.signalAll();
left.stopper.signalAll();
this.table.unlock();
}

}
 
K

kneitzel

Gast
Die Aufgabe eines Locks möchte ich einfach noch einmal hervorheben: Mit einem Lock kann man verhindern, dass mehrere Threads einen kritischen Codebereich ausführen. Also Du hast dann immer den Ablauf:
1. Lock
2. kritischer Abschnitt
3. unlock (in Java i.d.R. in einem finally Block)

Etwas in der Art ist ja schon bei Dir vorhanden, aber bitte überlege einmal: Was ist der kritische Abschnitt? Was darf nur ein Thread machen?

Bei dir ist das das Denken, Essen und das Wecken anderer Threads ... Ist das alles wirklich kritisch? Oder was davon ist wirklich kritisch?
 

Neue Themen


Oben