誰かがアイテムを渡した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
ます(必要に応じて無視してください)。
質問は次のとおりです。これを行うためのより良い方法はありますか? (同時実行性/効率性および/またはコードのクリーンさの両方で) 許されざる間違いを犯していますか? 前もって感謝します。