我是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();
}
}
}
答案 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条件将为真,你的生产者将等待)