2017-11-12 4 views
0

Im은 모니터를 사용하여 식당을 어떻게 구현하는지 이해하려고합니다. 나는 3 개의 클래스를 가지고 있는데, 메신저는 냄비가 비 었는지 아닌지에 대한 모니터 역할을하기 위해 주방 수업을 사용한다.모니터를 사용하여 야만족을 먹는 사람들

아래의 예제에서 스레드 2에서 널 포인터 예외가 계속 발생합니다.

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"); 
    } 

} 

모니터 내에서 세마포를 사용하지 않고 이러한 이벤트를 동기화 할 수 있습니까? 주방의 정의에서

+0

음,하지만 질문을 변경하십시오! 첫 번째 문제를 해결했기 때문에 내 대답은 첫 번째 질문에 대한 것이 었습니다.이 문제는 새로운 문제이며 새로운 질문이 필요합니다! 다음 사용자가 올 수 있도록 더 깨끗하게하기 위해 이것을 고려하십시오 –

답변

1

봐 :

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 

    } 

당신이 Cook 생성자에 null 객체를 제공하고 있습니다. 어쩌면 당신은 쿡 객체에 자신을 드리기를 원할 것입니다 :

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

본질적으로 클래스 객체의 인스턴스를 참조로 요리하는 것입니다. – 3rdeye7

+0

@ 3rdeye7 정확히 당신이 만들고있는 인스턴스지만, 나는 정말로 당신이 무엇을하려고 하는지를 모른다 ... 나는 방금 가능성을 언급했다. –