代码如下 
public class ProducerConsumer {
public static void main(String[] args){
SyncStack s = new SyncStack();
Producer p = new Producer(s);
Consumer c = new Consumer(s);
p.start();
c.start();
}
}class WoTou{
int id;

WoTou(int id){
this.id = id;
}
}class SyncStack{
int index = 0;
WoTou[] wotou = new WoTou[10];

public synchronized void push(WoTou w){
while(index==wotou.length){
try{
this.wait();
} catch (InterruptedException e){
e.printStackTrace();
}
}
this.notify();

wotou[index] = w;
index ++;

}

public synchronized WoTou pop(){
while(index==0){
try{
this.wait();
} catch (InterruptedException e){
e.printStackTrace();
}
}

this.notify();
index --;
return wotou[index];

}
}class Producer extends Thread{
SyncStack s = null;
Producer(SyncStack s){
this.s = s;
}
public void run(){
for(int i =0;i<20;i++){
WoTou w = new WoTou(i);
s.push(w);
System.out.println("生产了一个包子  "+w.id);
try{
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
}class Consumer extends Thread{
SyncStack s = null;

Consumer(SyncStack s){
this.s = s;
}
public void run(){
for(int i =0;i<20;i++){
WoTou w = s.pop();
System.out.println("消费了一个包子  "+w.id);
try{
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}还是生产者消费者问题,生产者生产一个,sleep(100) 消费者消费一个,sleep(1000);
开始是很快的生产,但是当while(index==wotou.length){
try{
this.wait();
} catch (InterruptedException e){
e.printStackTrace();
}
}生产线程停了,然后被唤醒之后,输出的是生产一个,消费一个,等全部生产了20个后,才消费开始多出来的,如下面的过程:生产了一个包子  0
消费了一个包子  0
生产了一个包子  1
生产了一个包子  2
生产了一个包子  3
生产了一个包子  4
生产了一个包子  5
生产了一个包子  6
生产了一个包子  7
生产了一个包子  8
生产了一个包子  9
消费了一个包子  9
生产了一个包子  10
生产了一个包子  11
消费了一个包子  11
生产了一个包子  12
消费了一个包子  12
生产了一个包子  13
消费了一个包子  13
生产了一个包子  14
消费了一个包子  14
生产了一个包子  15
消费了一个包子  15
生产了一个包子  16
消费了一个包子  16
生产了一个包子  17
消费了一个包子  17
生产了一个包子  18
消费了一个包子  18
生产了一个包子  19
消费了一个包子  19
消费了一个包子  10
消费了一个包子  8
消费了一个包子  7
消费了一个包子  6
消费了一个包子  5
消费了一个包子  4
消费了一个包子  3
消费了一个包子  2
消费了一个包子  1
想问下生产线程被唤醒之后,为什么不按照原来的样子就是很快的生产?????反而变成了生产一个消费一个的模式?最后才消费还是多的。
为什么啊 。期待解答

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【vstian】截止到2008-07-30 15:56:32的历史汇总数据(不包括此帖):
    发帖的总数量:28                       发帖的总分数:290                      每贴平均分数:10                       
    回帖的总数量:211                      得分贴总数量:120                      回帖的得分率:56%                      
    结贴的总数量:28                       结贴的总分数:290                      
    无满意结贴数:1                        无满意结贴分:20                       
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:3.57  %               无满意结分率:6.90  %                  
    敬礼!

    取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=vstian
      

  2.   

    分不多了 全押了中国队,千万别输啊。CHINA
      

  3.   

    yun shui lai bang wo kankan 
      

  4.   

    JAVA线程的执行顺序是不确定的,所以不要依赖顺序来开发JAVA线程.
      

  5.   

    分不多了 全押了美国队,千万别输啊。USA
      

  6.   

    很正常啊
    当生产的包子到了10个以后,index==wotou.length了, push(WoTou w)去wait了,生产进程就等在那里。
    然后到消费进程,吃掉了一个包子,这时候index=wotou.length-1了,因为吃掉了一个,再notify等待的进程,生产进程被唤醒,又生产了一个,index又变成wotou.length了,因为生产进程只等100ms,所以很快又调用push了,但是走到while(index==wotou.length)一句,又进去wait了,直到1000ms后下一次消费进程又吃掉一个包子才轮到它再生产下一个。如果你同时打印index,自然就看到它在10和9之间跳了。