Hi, I saw this lesson on Sun's site but I can not figure out why the output is the way it is. There are 3 files, Producer, Consumer, and CubbyHole.
public class Producer extends
Thread {
private CubbyHole cubbyhole;
private int number;
public Producer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
}
public void run() {
for (int i = 0; i < 10; i++) {
cubbyhole.put(i);
System.out.println("Producer #" + this.number + " put: " + i); try {
sleep((int)(Math.random() * 100));
}
catch (InterruptedException e) { }
}
}
}
public class Consumer extends Thread {
private CubbyHole cubbyhole;
private int number;
public Consumer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
}
public void run() {
int value = 0;
for (int i = 0; i < 10; i++) {
value = cubbyhole.get();
System.out.println("Consumer #" + this.number + " got: " + value);
}
}
}
public class CubbyHole {
private int contents;
private boolean available = false;
public synchronized int get() {
while (available == false) {
try {
wait();
} catch (InterruptedException e) { }
}
available = false;
notifyAll();
return contents;
}
public synchronized void put(int value) {
while (available == true) {
try {
wait();
} catch (InterruptedException e) { }
}
contents = value;
available = true;
notifyAll();
}
public static void main(
String []args){
CubbyHole cb = new CubbyHole();
Producer p = new Producer(cb, 5);
Consumer c = new Consumer(cb, 5);
p.start();
c.start();
}
}
The output is:
Producer #5 put: 0
Consumer #5 got: 0
Producer #5 put: 1
Consumer #5 got: 1
Producer #5 put: 2
Producer #5 put: 3
Consumer #5 got: 2
Consumer #5 got: 3
Producer #5 put: 4
Consumer #5 got: 4
Producer #5 put: 5
Consumer #5 got: 5
Producer #5 put: 6
Consumer #5 got: 6
Producer #5 put: 7
Consumer #5 got: 7
Producer #5 put: 8
Consumer #5 got: 8
Producer #5 put: 9
Consumer #5 got: 9
Why did Consumer got 2 after Producer already put 3?