我需要一个Object
当某些情况时得到异步通知BlockingQueue
有一件物品要赠送。
我在 Javadoc 和网络上搜索了一个预制的解决方案,然后我最终得到了我的一个(也许是幼稚的)解决方案,如下:
interface QueueWaiterListener<T> {
public void itemAvailable(T item, Object cookie);
}
and
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
对象(如果需要,请忽略它)。
问题是:有没有更好的方法来做到这一点?我是否犯了一些不可原谅的错误(无论是在并发/效率和/或代码整洁方面)?提前致谢。
也许你可以将一些子类化BlockingQueue
(例如ArrayBlockingQueue
or LinkedBlockingQueue
或者你正在使用的任何东西),添加对听众的支持并执行
@Override
public boolean add(E o) {
super.add(o);
notifyListeners(o);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)