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");
}
}
모니터 내에서 세마포를 사용하지 않고 이러한 이벤트를 동기화 할 수 있습니까? 주방의 정의에서
음,하지만 질문을 변경하십시오! 첫 번째 문제를 해결했기 때문에 내 대답은 첫 번째 질문에 대한 것이 었습니다.이 문제는 새로운 문제이며 새로운 질문이 필요합니다! 다음 사용자가 올 수 있도록 더 깨끗하게하기 위해 이것을 고려하십시오 –