Асинхронно уведомлена о блокировании, имеющем доступный предмет

StackOverflow https://stackoverflow.com/questions/7318166

  •  26-10-2019
  •  | 
  •  

Вопрос

Мне нужен 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 Объект (игнорируйте это, если хотите).

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

Это было полезно?

Решение

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

@Override
public boolean add(E o) {
    super.add(o);
    notifyListeners(o);
}

Другие советы

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

Этот конкретный вопрос «Простой сценарий с использованием wait () и уведомления () на Java» Предоставляет хороший обзор ожидания и уведомления и использование, связанное с BlockingQueue

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top