2 the catcher the_catcher 于 2016.05.11 00:29 提问

java多线程,生产者消费者问题.

新手,在试着生产者消费者问题,刚开始的时候,SyncStack为空,但是会出现先执行c那个线程,打印出eat 0.然后才是produce: 0.jdk1.8的环境. 这个是为什么呀

public class ProducerConsumer{
    public static void main(String[] args){
        SyncStack ss = new SyncStack();
        Producer p = new Producer(ss);
        Consumer c = new Consumer(ss);

         new Thread(p).start();
         new Thread(c).start();
//      tp.start();
//      tc.start();
    }
}

class WoTou{
    int id;
    WoTou(int id){
        this.id = id;
    }
    public String toString(){
        return "WoTou: "+id;
    }
}

class SyncStack{
    int index = 0;
    WoTou[] arrWT = new WoTou[6];

    public synchronized void push(WoTou wt){
        if(index==arrWT.length){
            try{
                this.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        this.notify();
        arrWT[index] = wt;
        index++;

    }

    public synchronized WoTou pop(){
        if(index == 0){
            try{
                this.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        this.notify();
        index--;
        return arrWT[index];
    }
}

class Producer implements Runnable{
    SyncStack ss = null;
    Producer(SyncStack ss){
        this.ss = ss;
    }
    public void run(){
        for(int i = 0;i<20;i++){
            WoTou wt = new WoTou(i);
            ss.push(wt);
            System.out.println("produce: "+wt);
            try{
//              Thread.sleep((int)(Math.random()*1000));
                Thread.sleep(1000);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

class Consumer implements Runnable{
    SyncStack ss = null;
    Consumer(SyncStack ss){
        this.ss = ss;
    }
    public void run(){
        for(int i = 0;i<20;i++){
            WoTou wt = ss.pop();
            System.out.println("eat: "+wt);
            try{
//              Thread.sleep((int)(Math.random()*1000));
                Thread.sleep(100);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

3个回答

danielinbiti
danielinbiti   Ds   Rxr 2016.05.11 00:46
 再生产完就要打印,而不是等生产完通知消费进程后再打印

            ss.push(wt);
            System.out.println("produce: "+wt);
                        改

            System.out.println("produce: "+wt);
            ss.push(wt);

                        另外

        this.notify();
        arrWT[index] = wt;
        index++;
                notify应该放到最后
                改

        arrWT[index] = wt;
        index++;
        this.notify();//生产了再通知
CSDNXIAOC
CSDNXIAOC   2016.05.11 00:32

       生产者消费者问题是研究多线程程序时绕不开的问题,它的描述是有一块生产者和消费者共享的有界缓冲区,生产者往缓冲区放入产品,消费者从缓冲区取走产品,这个过程可以无休止的执行,不能因缓冲区满生产者放不进产品而终止,也不能因缓冲区空消费者无产品可取而终止。
       解决生......
答案就在这里:java中的生产者与消费者问题(多线程)
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

havedream_one
havedream_one   2016.05.11 07:57
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!