展开全部
首先说明 你的程序有漏洞
消费者32313133353236313431303231363533e78988e69d8331333361323534和生产者的模型 你搞错了
你应该在生产好了产品 就打印出来 产品 +1 而不是生产出来了 通知消费者之后 在产品+1
如果 找你这样 就是我产品已经生产出来了 通知消费者了
然后 生产者 准备开始 通知 +1
消费者 准备开始 消费 -1
这两个线程 你确定谁先执行; 如果通知的晚了 你的标识牌上说没有产品 可是消费者 看到了有一个产品 就消费了 ,你就纠结了 :我明明没有吧标示牌 更改过来呢 ,怎么他们就消费了呢;然后你感到自己很蠢;
正确的做法 是 :你生产出来 产品 就+1 然后通知消费者;
public class ProducerConsumerTest {
public static void main(String[] args) {
Box b = new Box();
Producer pr = new Producer(b);
Consumer cr = new Consumer(b);
pr.start();
cr.start();
}
}
class Box {
private int data;
private boolean ava = false;
public synchronized int setData(int value) {
while (ava == true) {
try {
wait();
} catch (InterruptedException e) {
}
}
data = value;
ava = true;
System.out.println("-1");
notifyAll();
return data;
}
// p
public synchronized int getData() {
while (ava == false) {
try {
wait();
} catch (InterruptedException e) {
}
}
ava = false;
System.out.println("+1");
notifyAll();
return data;
}
}
class Consumer extends Thread {
private Box b;
public Consumer(Box b) {
this.b = b;
}
@Override
public void run() {
int buffer = 0;
for (int i = 0; i
buffer = b.getData();
// System.out.println("Consumer" + "got:" + buffer);
}
}
}
class Producer extends Thread {
private Box b;
public Producer(Box b) {
this.b = b;
}
@Override
public void run() {
for (int i = 0; i
int c = b.setData(i);
// System.out.println("Pronducer" + "put:" + c);
try {
sleep((int) (Math.random() * 100));
} catch (InterruptedException e) {
}
}
}
}