12

誰かがアイテムを渡したObjectときに、非同期で通知を受ける必要があります。BlockingQueue

Javadoc と Web の両方で事前に作成されたソリューションを検索した後、最終的に私の (おそらくナイーブな) ソリューションになりました。

interface QueueWaiterListener<T> {
    public void itemAvailable(T item, Object cookie);
}

class QueueWaiter<T> extends Thread {

    protected final BlockingQueue<T> queue;
    protected final QueueWaiterListener<T> listener;
    protected final Object cookie;

    public QueueWaiter(BlockingQueue<T> queue, QueueWaiterListener<T> listener, Object cookie) {
        this.queue = queue;
        this.listener = listener;
        this.cookie = cookie;
    }

    public QueueWaiter(BlockingQueue<T> queue, QueueWaiterListener<T> listener) {
        this.queue = queue;
        this.listener = listener;
        this.cookie = null;
    }

    @Override
    public void run() {
        while (!isInterrupted()) {
            try {
                T item = queue.take();
                listener.itemAvailable(item, cookie);
            } catch (InterruptedException e) {
            }
        }
    }
}

基本的に、操作が成功するたびtake()にリスナーオブジェクトをコールバックするキューの操作をブロックするスレッドがありtake()、オプションで特別なオブジェクトを送り返しcookieます(必要に応じて無視してください)。

質問は次のとおりです。これを行うためのより良い方法はありますか? (同時実行性/効率性および/またはコードのクリーンさの両方で) 許されざる間違いを犯していますか? 前もって感謝します。

4

3 に答える 3

13

おそらく、いくつかをサブクラス化しBlockingQueueArrayBlockingQueueorLinkedBlockingQueueまたは使用しているものなど)、リスナーのサポートを追加して、

@Override
public boolean add(E o) {
    super.add(o);
    notifyListeners(o);
}
于 2011-09-06T10:14:50.573 に答える
0

これは、キュー ブロッキングとリスナーの優れた標準パターンのようです。リスナー インターフェイスの作成は適切に選択できます。BlockingQueue クラスを使用していない場合 (これについてはよくわかりません)、唯一のことは、ブロッキング コールを管理するためwait()の正しい管理を行っていることです。notify()

この特定の SO の質問「java で wait() と notify() を使用する簡単なシナリオ」は、待機と通知の概要と、BlockingQueue に関連する使用法を提供します。

于 2011-09-06T10:14:15.347 に答える