一、问题描述
在练习Java的PCM(生产消费模型)的工程中,生产者发送消息出现java.lang.NullPointerException异常。
二、主要代码
1、写入及拉取方法
描述:生产者向存储中放,消费者从存储中拿。当存储队列满的时候,生产者要挂起(等待),并通知消费者取数据
当队列空的时候,消费者挂起(等待),并通知生产者放数据
以上用的是:wait notify,放和拿需要同步锁
麦当劳点餐:点餐--排队--取餐
public class ProducerConsumer {
//队列存储
LinkedList<Integer> linkedList = new LinkedList<>();
//设置最大值
int max = 10;
public void push(int n) {
try {
synchronized (linkedList) {
//满了
if (linkedList.size() >= max) {
System.out.println("容器满了......");
linkedList.wait(); //挂起
}
//没满,可以放入
else {
System.out.println("产生" + n);
linkedList.add(n);
linkedList.notifyAll(); //唤醒取得线程,在linkedList上等的线程
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public int pop() {
try {
synchronized (linkedList) {
//空
if (linkedList.size() <= 0) {
System.out.println("容器空了......");
linkedList.wait();
return 0;
}
//非空
else {
int n = linkedList.poll();
System.out.println("取出" + n);
linkedList.notify(); //
return n;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
}
2、生产者
package threadXianCheng;
public class producerTask implements Runnable {
private ProducerConsumer store;
public producerTask() {}
public producerTask(ProducerConsumer store) {
this.store = store;
}
@Override
public void run() {
while (true) {
try {
//模拟0-100随机数
int r = (int) (Math.random() * 100);
store.push(r);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
3、消费者
public class ConsumerTask implements Runnable {
public ProducerConsumer store;
public ConsumerTask() {
}
public ConsumerTask(ProducerConsumer store) {
this.store = store;
}
@Override
public void run() {
while (true) {
try {
while (true) {
System.out.println(store.pop());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
4、运行代码
public class RunPCM {
public static void main(String[] args){
ProducerConsumer producerConsumer = new ProducerConsumer();
//创建生产者
producerTask pp = new producerTask(producerConsumer);
//创建生产者线程
Thread t1 = new Thread(pp);
//创建消费者
ConsumerTask cc = new ConsumerTask(producerConsumer);
//创建消费者线程
Thread t2 = new Thread(cc);
//启动生产者
t1.start();
//启动消费者
t2.start();
}
}
三、解决
真的是太粗心了!!!!!
创建生产者、消费者的时候,传参数啊!我没传,没穿就NULL了呗!!!
run方法中不要!!死循环!消耗系统性能!!