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

JAVA线程问题,新手求教
看视频然后自己写的一个比较简单的生产者消费者问题,发现有时还没生产就能消费了。。。求教,谢谢




public class RunCandP {

public static void main(String[] args) {
pot P1 = new pot();
consumer C1 = new consumer(P1);
cooker   Co1 = new cooker(P1);
new Thread(Co1).start();
new Thread(C1).start();
}

}

public class consumer implements Runnable {
pot P = null;
public consumer(pot P){
this.P = P;
}
public void run(){
for (int f=0;f<20;f++){
P.get();
System.out.println("吃了面包"+bread.all+"    "+P.index);
}
}
}

public class cooker implements Runnable {
pot P =null;
public cooker(pot P){
this.P=P;
}
public void run(){
for(int f=0;f<20;f++){
P.add(new bread());
System.out.println("生产了"+bread.all+"    "+P.index);
}
}

}


public class pot {

bread[] p=new bread[6];
int index=0;

public synchronized void add(bread a){
try{
 while (index == p.length) {
System.out.println("停止生产,等待中...");
this.wait();
 }}catch(InterruptedException e) {
System.out.println("添加出错。");
  }
this.notify();
p[index]=a;
    index++;
}



public synchronized bread get(){
try {
while (index == 0) {
System.out.println("没有得吃了,等待生产...");
this.wait();
}}catch(InterruptedException e){
System.out.println("消费出错。");
}
this.notify();
bread a = this.p[index];
this.p[index]=null;
index--;
return a;
}
}



public class bread {
static int all=0;
bread(){
all++;
}
public String toString() {
return "bread:"+"第"+all+"个";
}
}



------解决方案--------------------
在consumer 里面你需要检测BREAD[] 是不是为空
在COOKER 里面你需要检测BREAD[]是不是已经满了
------解决方案--------------------
int?index=0;
这个前面加 violate int index=0;

while (index == p.length) 这个建议改成 while (index >= p.length) 

 while (index == 0) 这个建议改成 while (index <= 0)

this.notify();
p[index]=a;
index++;
这个地方你把顺序改一下,
p[index]=a;
index++;
this.notify();