java - 线程消费者内部的 NullPointerException

标签 java multithreading

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/

相关文章:

java - Android ActionBar 带有自定义图标?

java - 将 DWORD 字节数组转换为无符号长数字

java - 使用 POI 异常

c# - 如何通过任务使用 Clipboard.GetText?

multithreading - 如何原子地使用一组句柄?

c# - 锁定困惑的串口端口句柄

java - 如何在 low api 中使用 getCurrencyInstance 和 format?

java - 如何在jacoco中配置classDumpDir?

python - 如何在不连续检查标志的情况下终止Python线程

C#:在并行线程中设置 HttpContext.Current 有什么问题吗?