2

以下の擬似コードにはpoll()、メインスレッドで永久に呼び出される関数があります。sleep()のステートメントなしでこれを行うとpoll()、他のスレッドによって1分間に2〜3個のアイテムのみがキューに追加されます。これは、ポーリングがput()ステートメントをブロックすることを意味しますか?

どうすればこの問題を解決できますか?

public class Test extends Thread{
    private LinkedBlockingQueue<Object> queue = null;

    Test(){
        queue = new LinkedBlockingQueue<Object>(10);
    }

    public void run(){
        // Do stuff, get incoming object from network
        queue.put(o);
    }

    public Object poll(){
        Object o = queue.poll();
        sleep(1000);
        return o;
    }
}
4

1 に答える 1

14

これは、ポーリングがput()ステートメントをブロックすることを意味しますか?

いいえ、LinkedBlockingQueue完全に再入可能であり、poll()メソッドはをブロックしませんput()。ただし、poll()メソッドはすぐに戻ります。queue.take()キューが空の場合にnullを返すのではなく、キューにアイテムが存在するのを待機するwhichを使用する必要があります。

// wait for there to be an object in the queue
Object o = queue.take();
// no sleep necessary
return o;

10エントリの制約付きブロッキングキューを作成しているので、mainがでブロッキングしているsleep()と思います。キューがいっぱいになり、プログラムの速度が低下します。あなたはたぶん、そこに戻ってより短い時間寝るsleep場合にのみすべきです。poll()null

編集: @JohnVintがコメントで述べたように、別の代替手段はpoll(long, TimeUnit)、アイテムがキューに追加されるのを一定期間待機しnull、タイマーが期限切れになると戻るメソッドを使用することです。これは、キュー内の何かを待つためのよりクリーンな方法です。

// wait for 1000ms for there to be an object in the queue
Object o = queue.poll(1000, TimeUnit.MILLISECONDS);
// no sleep necessary
return o;
于 2012-05-14T19:01:47.713 に答える