1

私は生産者/消費者問題を試みていましたが、なぜ私が java.lang.NullPointerException消費者の中に入るのかわかりません。

package com ;

import java.util.concurrent.PriorityBlockingQueue;

public class Producer extends CommonClass implements Runnable {

    private int producerNum;

    Producer(PriorityBlockingQueue<Character> queue) {
        queue = queue;
    }

    public void run() {

        char ch;

        for (ch = 'a'; ch <= 'z'; 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 )
    {
        queue = queue;  
    }

    public void run() {
        char c;

        for (int i = 0; i < 27; i++) {
            c = queue.poll();
            System.out.println("Consumer" + consumerNum + "consumed:" + c);
            try {
                Thread.sleep((int) (Math.random() * 300));
            } catch (InterruptedException e) {
                System.out.println("Error");
            }
        }

    }
}

package com ;

import java.util.concurrent.PriorityBlockingQueue;

public class CommonClass {

     PriorityBlockingQueue<Character> queue = new PriorityBlockingQueue<Character>();

}

package com ;

import java.util.concurrent.PriorityBlockingQueue;

public class SyncTest {

    public static void main(String[] args) {



         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();

    }
}

これは私が得る例外です:

Exception in thread "Thread-1" java.lang.NullPointerException
    at com.Consumer.run(Consumer.java:18)
    at java.lang.Thread.run(Unknown Source)
4

2 に答える 2

8

これは当面の問題です。

Consumer(PriorityBlockingQueue<Character> queue )
{
    queue = queue;  
}

これはno-opステートメントであり、パラメーターの値をそれ自体に割り当てます。あなたが欲しい:

Consumer(PriorityBlockingQueue<Character> queue )
{
    this.queue = queue;  
}

これを修正すると、(でデカールされた)呼び出しが原因で潜在的な問題が発生し、キューが空の場合に返されます。次に、そのnull参照のボックスが解除され、値が(タイプの)変数に割り当てられます。poll()Queuenullcchar

代わりにtake()(で宣言されているBlockingQueue)を使用すると、ブロックされます。タイムアウトも指定することをお勧めします。

于 2012-09-20T12:49:44.133 に答える
3

Use take instead of pollポーリングはnullを返す場合があります。

JavaDoc#poll()

このキューの先頭、またはこのキューが空の場合はnull

ブロッキングメソッドputを追加および取得するために使用します。get

于 2012-09-20T12:49:13.007 に答える