首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >线程使用者内部的NullPointerException

线程使用者内部的NullPointerException
EN

Stack Overflow用户
提问于 2012-09-20 13:47:13
回答 3查看 125关注 0票数 2

可能重复: I am getting NullPointerException inside Consumer

这是否被认为是生产者,消费者场景中的一个bug?

,这是我的制作人班。

代码语言:javascript
复制
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");
            }

        }

    }

}

这是我的消费类

代码语言:javascript
复制
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

代码语言:javascript
复制
package com ;

import java.util.concurrent.PriorityBlockingQueue;

public class CommonClass {

    PriorityBlockingQueue<Character> queue = null;

}

这是我的客户程序

代码语言:javascript
复制
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();

    }
}

当我运行时,输出作为

代码语言:javascript
复制
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字母的情况下。

这个输出有什么问题吗?正如我所看到的那样,Producer0produced语句两次同时出现,然后对字母e和f同时接Consumer0consumed语句。

我担心用这个代码我会错过由生产者??生成的任何信息

请给我建议?

谢谢你的建议。

EN

Stack Overflow用户

回答已采纳

发布于 2012-09-20 13:50:13

这个输出有什么问题吗?

不是的。您的生产者线程在使用者使用第一个项目之前,刚刚成功地生成了第二个项目。这是完全自然的,特别是当你随意睡觉的时候。

当然,您可能希望给队列设置一个上限,然后使用offer而不是add来检测队列已满的情况--但是您显示的输出很好。

票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12514042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档