日期:2014-05-20  浏览次数:20721 次

生产者与消费者堆栈问题
public class ProducerConsumer {
public static void main(String [] args) {
SyncStack ss = new SyncStack();
Producer p = new Producer(ss);
Consumer c = new Consumer(ss);
Thread p1 = new Thread(p);
Thread c1 = new Thread(c);
p1.start();c1.start();
while(c1.isAlive() == false) {
System.out.println("操作结束,一共进行了" +SyncStack.num + "次操作!");
}
}
}

class Product {
private int id ;
Product(int id ) {
this.id = id;
}

public String toString() {
return "Product:" + id;
}
}

class SyncStack {
private Product [] arr = new Product[10];
private int index = 0;
static int num = 0;

public synchronized void push(Product pd) {
while(index == arr.length) {
try {
this.wait();
}catch(InterruptedException x) {
x.printStackTrace();
}
}
this.notify();
num++;
arr[index] = pd;
index++;
}

public synchronized Product pop() {
while(index == 0) {
try {
this.wait();
}catch(InterruptedException x) {
x.printStackTrace();
}
}
this.notify();
num++;
index--;
return arr[index];
}

}

class Producer implements Runnable {
private SyncStack ss;
Producer(SyncStack ss) {
this.ss = ss;
}

public void run() {
for(int i = 1;i<21;i++) {
Product pd = new Product(i);
ss.push(pd);
System.out.println("生产了" + pd + "!");
}
try {
Thread.sleep((int)(Math.random()*1000));
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}

class Consumer implements Runnable {
private SyncStack ss;
Consumer(SyncStack ss) {
this.ss = ss;
}

public void run() {
for(int i = 0;i<20;i++) {
Product pd = ss.pop();
System.out.println("消费了" + pd +"!");
try {
Thread.sleep((int)(Math.random()*1000));
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
这是一个关于生产者和消费者的小程序,但是运行结果与预期的不太一样。第一:生产和消费的顺序不是按照堆栈的形式打印出来;第二main方法最后的语句while(c1.isAlive() == false) {
System.out.println("操作结束,一共进行了" +SyncStack.num + "次操作!");
}
为什么执行不出来?
打印结果:
D:\java\ProducerConsumer>javac Pro**.java

D:\java\ProducerConsumer>java ProducerConsumer
生产了Product:1!
生产了Product:2!
生产了Product:3!
生产了Product:4!
生产了Product:5!
生产了Product:6!
生产了Product:7!
生产了Product:8!
消费了Product:3!
生产了Product:9!
生产了Product:10!
生产了Product:11!
生产了Product:12!
消费了Product:11!
生产了Product:13!
消费了Product:12!
生产了Product:14!
消费了Product:13!
生产了Product:15!
消费了Product:14!
生产了Product:16!
消费了Product:15!
生产了Product:17!
消费了Product:16!
生产了Product:18!
消费了Product:17!
生产了Product:19!
消费了Product:18!
生产了Product:20!
消费了Product:19!
消费了Product:20!
消费了Product:10!
消费了Product:9!
消费了Product:8!
消费了Product:7!
消费了Product:6!
消费了Product:5!
消费了Product:4!
消费了Product:2!
消费了Product:1!


------解决方案--------------------
while条件满足它会一直执行下去
while条件不满足它会直接跳出
你原来执行while(c1.isAlive() == false)的时候,c1是活着的,所以c1.isAlive()为true,所以while条件不满足,直接跳出,
下班,回家
------解决方案--------------------
探讨

private static int id = 0;

public String toString() {
return "产品" + id;
}