Мне нужно, чтобы Объект
был асинхронно уведомлен, когда какой-нибудь BlockingQueue
должен дать предмет.
Я искал и в Javadoc, и в сети в поисках готового решения, а затем получил (может быть, наивное) решение, вот оно:
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
объект (игнорируйте его, если хотите).
Вопрос в том, есть ли лучший способ сделать это? Делаю ли я какую-нибудь непростительную ошибку (как по параллельности/эффективности, так и по чистоте кода)? Заранее спасибо.