2019-10-20 PCM中的 java.lang.NullPointerException

一、问题描述
在练习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方法中不要!!死循环!消耗系统性能!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容