アイテムを利用できるアイテムを持っているブロッキングキューを非同期的に通知する
-
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()を使用した簡単なシナリオ」 待機と通知の適切な概要と、ブロックキューに関連する使用法を提供します
所属していません StackOverflow