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