Будучи асинхронно уведомленным о том, что BlockingQueueue имеет доступный элемент

Мне нужно, чтобы Объект был асинхронно уведомлен, когда какой-нибудь 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 объект (игнорируйте его, если хотите).

Вопрос в том, есть ли лучший способ сделать это? Делаю ли я какую-нибудь непростительную ошибку (как по параллельности/эффективности, так и по чистоте кода)? Заранее спасибо.

11
задан gd1 6 September 2011 в 10:12
поделиться