Получать асинхронное уведомление о наличии элемента BlockingQueue

Мне нужно 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 (игнорируйте его если хочешь).

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

11 голосов | спросил gd1 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 06 Sep 2011 14:06:39 +0400 2011, 14:06:39

2 ответа


0

Возможно, вы могли бы создать подкласс некоторого BlockingQueue (например, ArrayBlockingQueue или LinkedBlockingQueue или все, что вы используете), добавьте поддержку для слушателей и выполните

@Override
public boolean add(E o) {
    super.add(o);
    notifyListeners(o);
}
ответил aioobe 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 06 Sep 2011 14:14:50 +0400 2011, 14:14:50
0

Это похоже на хороший стандартный шаблон для блокировки очереди и слушателей. Вы делаете хороший выбор, делая интерфейс слушателя. Если вы не используете класс BlockingQueue (который мне не совсем понятен), единственное, что вам нужно, - это правильный wait() и notify() для управления вызовом блокировки.

Этот конкретный вопрос SO "Простой сценарий с использованием ожидания ( ) и notify () в java " предоставляет хороший обзор ожиданий и уведомлений, а также использования, связанного с BlockingQueue

ответил momo 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 06 Sep 2011 14:14:15 +0400 2011, 14:14:15

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132