Ich versuche zu verstehen, wie Dining Savages mit Monitoren zu implementieren. Ich habe drei Klassen und benutze die Küchenklasse als Monitor, wenn der Topf leer ist oder nicht.Essen Wilden mit Monitoren
Aus irgendeinem Grund bekomme ich eine Nullzeigerausnahme bei Thread zwei in meinem Beispiel unten.
class Kitchen {
Kitchen k;
int c;
boolean empty;
Cook chef;
Kitchen() {
this.c = 0;
this.empty = true;
chef = new Cook(k);
}
synchronized void putServingsInPot(int servings) {
if (empty) {
this.c = servings;
}
empty = false;
notify();
}
synchronized void getServingsFromPot() {
while (empty) {
try {
System.out.println("Bout to wait");
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("In Catch");
e.printStackTrace();
}if (c == 0) {
empty = true;
chef.run();
}else if(c > 0 && empty == false){
c--;
}
}
}
}
class Savage extends Thread {
Kitchen k;
Savage(Kitchen k) {
this.k = k;
}
public void run() {
while (true) {
k.getServingsFromPot();
try {Thread.sleep(500); // eat
} catch (Exception e) { return;}
}
}
}
class Cook extends Thread {
Kitchen k;
Cook(Kitchen k) {
this.k = k;
}
public void run() {
while (true) {
try {Thread.sleep(500); // sleep
} catch (Exception e) {return;}
k.putServingsInPot(10); // 10 servings
}
}
}
public class main {
public static void main(String Args[]) {
// Kitchen testing
Kitchen k = new Kitchen();
Cook c = new Cook(k);
c.start();
Savage sc[] = new Savage[9];
for (int i = 0; i < 9; i++) {
sc[i] = new Savage(k);
sc[i].start();
}
try {
Thread.sleep(5000);
} catch (Exception e) {
}
for (int i = 0; i < 9; i++) {
sc[i].interrupt();
}
c.interrupt();
System.out.println("Done\n");
}
}
Ist es möglich, diese Ereignisse ohne Verwendung eines Semaphors innerhalb des Monitors zu synchronisieren?
Mmm aber du änderst die Frage! Meine Antwort war für deine ersten Fragen, roll sie zurück, weil ich das erste Problem gelöst habe, das ist ein neues Problem und braucht eine neue Frage! Bitte beachten Sie dies, um für die nächsten Benutzer sauberer zu sein und zu lesen –