1
class NaiveSQ<E> {
    boolean putting = false;
    E item = null;

    public synchronized E take() throws InterruptedException {
        while (item == null)
            wait();
        E e = item;
        item = null;
        notifyAll();
        return e;
    }

    public synchronized void put (E e) throws InterruptedException {
        if (e == null)
            return;
        while (putting)
            wait();
        putting = true;
        item = e;
        notifyAll();
        while (item != null)
            wait();
        putting = false;
        notifyAll();
    }
}

class Producer implements Runnable {
    int id = -1;
    int limit = 1;

    Producer(int x) {
        id = x;
    }

    public void run() {
        System.out.printf("I am producer number %d\n", id);
        for (int i=0; i<limit; i++) {
            Integer I = new Integer(i);
            try {
                Test.queue.put(I);
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    }
}

class Consumer implements Runnable {
    int id = -1;

    Consumer(int x) {
        id = x;
    }

    public void run() {
        try {
            Integer I = Test.queue.take();
            System.out.printf(
                "I am consumer number %d - I read %d\n", id, I.intValue());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

public class Test{
    static NaiveSQ<Integer> queue;
    public static void main (String [] args){
        System.out.println("hello from Java");
        Thread p = new Thread(new Producer(1));
        p.start();
        for (int i=0; i<1; i++) {
            Thread c = new Thread(new Consumer(i));
            c.start();
        }
    }
};

また、例外に null が含まれているのはなぜですか? これはhttp://www.cs.rice.edu/~wns1/papers/2006-PPoPP-SQ.pdfリスト 3からの実装です。

次のように出力されます

hello from Java
I am producer number 1
null
null

なぜ null になるのですか?

4

2 に答える 2

4

メイン メソッドでキューを開始していません。キュー オブジェクトが作成されず、プロデューサーとコンシューマーが null のキューを参照するため、NullPointerException が発生すると思います。

于 2012-06-18T20:29:10.940 に答える
0

キューを適切に初期化しても、実装には大きな問題があります。キューが空のときにConsumerスレッドがアイテムを取得しようとすると(コードによれば完全に可能です)、Consumerスレッドはオブジェクトへのロックを保持する無期限の待機に入ります。Producerスレッドはアイテムをキューに入れることはできません。全体が停止します。

于 2012-06-18T20:46:10.280 に答える