Асинхронно уведомлена о блокировании, имеющем доступный предмет
-
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