0

我是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();
            }

    }

}
4

3 回答 3

5

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

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

检查i>10约束。可能你想试​​试i<10

于 2013-07-18T07:10:48.753 回答
0

当我为消费者获得超过 10 岁时会发生什么?假设您正确同步,生产者正在生产 50 个元素,而消费者只会查看其中的 10 个。当您执行 queue.remove(i) 时,您如何知道该插槽中有一个元素?如果

生产者运行 1 次迭代并在 0 处插入元素消费者运行 1 次迭代,消费者的 i 现在将是 1 个生产者运行 1 次迭代并在 0 处插入元素消费者在清醒时运行 1 次迭代,但不能消耗任何东西,所以它再次等待。

可能要重新考虑您拥有的解决方案:-)

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

于 2013-07-18T07:09:46.290 回答
0

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



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

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

于 2013-07-18T07:16:19.860 回答