アイテムを利用できるアイテムを持っているブロッキングキューを非同期的に通知する

StackOverflow https://stackoverflow.com/questions/7318166

  •  26-10-2019
  •  | 
  •  

質問

私は必要です 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) {
            }
        }
    }
}

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

質問:これを行うためのより良い方法はありますか?私はいくつかの許されない間違いをしていますか?前もって感謝します。

役に立ちましたか?

解決

おそらくあなたはいくつかをサブクラス化することができます BlockingQueue (そのような ArrayBlockingQueue また LinkedBlockingQueue またはあなたが使用しているものは何でも)、リスナーのサポートを追加し、

@Override
public boolean add(E o) {
    super.add(o);
    notifyListeners(o);
}

他のヒント

これは、キューブロッキングとリスナーにとって優れた標準パターンのように見えます。リスナーインターフェイスを作成するのに適した選択をします。 Blockcockqueueクラスを使用していない場合(私は明確ではありません)、唯一のことはあなたが管理していることです wait()notify() ブロッキングコールを管理するため。

この特定の質問 「Javaのwait()とnotify()を使用した簡単なシナリオ」 待機と通知の適切な概要と、ブロックキューに関連する使用法を提供します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top