Possible Duplicate:
I am getting NullPointerException inside Consumer
这是否被认为是生产者、消费者场景中的错误??
这是我的 Producer 类(class)。
package com ;
import java.util.concurrent.PriorityBlockingQueue;
public class Producer extends CommonClass implements Runnable {
private SyncronizedStack stack;
private int producerNum;
Producer(PriorityBlockingQueue<Character> queue) {
this.queue = queue;
}
public void run() {
char ch;
for (ch = 'a'; ch <= 'f'; ch++) {
queue.add(ch);
System.out.println("Producer" + producerNum + "produced :" + ch);
try {
Thread.sleep((int) (Math.random() * 300));
} catch (InterruptedException e) {
System.out.println("Error");
}
}
}
}
这是我的消费者类别
package com ;
import java.util.concurrent.PriorityBlockingQueue;
public class Consumer extends CommonClass implements Runnable {
private int consumerNum;
Consumer(PriorityBlockingQueue<Character> queue) {
this.queue = queue;
}
public void run() {
char c;
for (int i = 0; i < 7; i++) {
try {
c = queue.take();
System.out.println("Consumer" + consumerNum + "consumed:" + c);
} catch (Exception e1) {
e1.printStackTrace();
}
try {
Thread.sleep((int) (Math.random() * 300));
} catch (InterruptedException e) {
System.out.println("Error");
}
}
}
}
这是我的 CommonClass
package com ;
import java.util.concurrent.PriorityBlockingQueue;
public class CommonClass {
PriorityBlockingQueue<Character> queue = null;
}
这是我的客户端程序
package com ;
import java.util.concurrent.PriorityBlockingQueue;
public class SyncTest {
public static void main(String[] args) {
CommonClass cs = new CommonClass();
PriorityBlockingQueue<Character> queue = new PriorityBlockingQueue<Character>();
Producer p1 = new Producer(queue);
Thread t1 = new Thread(p1);
t1.start();
Consumer c1 = new Consumer(queue);
Thread ct1 = new Thread(c1);
ct1.start();
}
}
当我运行这个时,我得到的输出为
Producer0produced :a
Consumer0consumed:a
Producer0produced :b
Consumer0consumed:b
Producer0produced :c
Consumer0consumed:c
Producer0produced :d
Consumer0consumed:d
Producer0produced :e
Producer0produced :f
Consumer0consumed:e
Consumer0consumed:f
这是 e 和 f 字母的情况。
这个输出有什么问题吗?正如我看到的那样, Producer0 同时生产了两次语句,然后是 Consumer0consumed 语句同时用于字母 e 和 f 。
我担心使用此代码我会错过 Producer 生成的任何信息吗??
请指教??
感谢您的建议。
最佳答案
Is there any problem with this output ?
不。在消费者成功消费第一个项目之前,您的生产者线程刚刚成功生产了第二个项目。这是完全自然的,尤其是当您随机 sleep 时。
当然,您可能想为队列指定一个上限 - 然后使用 offer
而不是 add
来检测队列已满的情况 - 但您显示的输出很好。
关于java - 线程消费者内部的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12514042/