2017-11-12 1 views
0

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?

+0

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 –

Antwort

1

Blick auf die Definition der Küche:

class Kitchen { 
    Kitchen k; // Here the kitchen is null 
    int c; 
    boolean empty; 
    Cook chef; 
    Kitchen() { 
    this.c = 0; 
    this.empty = true; 
    chef = new Cook(k); // here you give a null object to the cook constructor 

    } 

Sie ein null Objekt an den Konstruktor Cook geben. Vielleicht möchtest du dich dem Cook-Objekt widmen:

class Kitchen { 
    //Kitchen k; I don't think you will need it anymore, you can delete this line 
    int c; 
    boolean empty; 
    Cook chef; 
    Kitchen() { 
    this.c = 0; 
    this.empty = true; 
    chef = new Cook(this); // give yourself to the Cook 

    } 
+0

Also, indem Sie im Wesentlichen die Instanz des Klassenobjekts übergeben, um als Referenz zu kochen? – 3rdeye7

+0

@ 3rdeye7 genau, die Instanz, die Sie erstellen, aber ich weiß nicht wirklich, was versuchst du so zu tun ... Ich habe nur die Möglichkeit erwähnt –