为什么消费者不会在此程序中消耗数据

时间:2013-07-18 07:03:36

标签: java producer-consumer

我是java的新手,我正在尝试实现简单的生产者消费者问题。下面是我为测试它而编写的代码。我有3个类,主类,生产者类和消费者类。现在的问题是我的生产者正在生产数据,但我的消费者并没有消费它。有人可以解释一下为什么会发生这种情况。提前谢谢。

public class ProducerConsumerWithQueue {
    /**
     * @param args
     */
    public static void main(String[] args) {

        ArrayList<String > queue = new ArrayList<String>();         
        Producer producer = new Producer( queue);           
        Consumer consumer = new Consumer( queue);

        consumer.start();
        producer.start();   
    }
}


public class Producer extends Thread{
    ArrayList<String> queue;
        public Producer(ArrayList<String> queue) {
        this.queue = queue;
    }

    public void run(){
        System.out.println("Producer Started");
        System.out.println("Producer size "+queue.size());
        for(int i=0;i<50;i++){
            try {
                    synchronized (this) {               
                    if(queue.size()>10){
                        System.out.println("Producer Waiting");
                        wait();
                    }else{
                        System.out.println("producing "+i);
                        queue.add("This is "+i);
                        notifyAll();
                    }
                }
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
        }
    }

}

public class Consumer extends Thread{

    ArrayList<String> queue;

    public Consumer(ArrayList<String> queue) {
        this.queue = queue;
    }

    public void run(){
        System.out.println("Consumer started");
        System.out.println("Consumer size "+queue.size());
            try {
                synchronized (this) {               
                    for(int i=0; i>10; i++){
                        if(queue.isEmpty()){
                            System.out.println("Consumer waiting()");
                            wait();

                        }else{
                            System.out.println("Consuming Data "+queue.remove(i));
                            notifyAll();
                        }
                    }
                }
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    }

}

3 个答案:

答案 0 :(得分:5)

您的消费者永远不会运行,因为for循环甚至不会运行一次

for(int i=0; i>10; i++){

检查 i&gt; 10 约束。您可能想尝试i<10

答案 1 :(得分:0)

当我为消费者超过10岁时会发生什么?假设您正确地进行了同步,那么生产者正在生产50个元素,而消费者只会查看其中的10个元素。当你排队时也是如此。删除(i)你怎么知道那个插槽里有一个元素?如果

producer运行1次迭代并将元素插入0 消费者运行1次迭代,消费者的i现在为1 producer运行1次迭代并将元素插入0 消费者在清醒时运行1次迭代,但不能消耗任何东西,因此它会再次等待。

可能想重新考虑你所拥有的解决方案: - )

http://www.tutorialspoint.com/javaexamples/thread_procon.htm

答案 2 :(得分:0)

这是因为在你的制片人中你有这个:



if(queue.size()>10){
           System.out.println("Producer Waiting");
           wait();
       }

当你的制作人首先开始(你的消费者等待),当你的制作人富有这条线时,它也会等待,你的消费者和制作人将会无限期等待! (这是因为你在50循环中使用生产者,因此当生产项目达到11时,if条件将为真,你的生产者将等待)