Potrzebuję Object
, aby być asynchronicznie powiadamiany, gdy niektóre BlockingQueue
ma przedmiotu do podania.Będąc asynchronicznie powiadamiane o BlockingQueue posiadające element dostępny
Rozglądałem zarówno Javadoc oraz w internecie na pre-made roztworze, a następnie skończyło się z (być może naiwne) roztworu kopalni, to jest tutaj:
interface QueueWaiterListener<T> {
public void itemAvailable(T item, Object cookie);
}
i
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) {
}
}
}
}
Zasadniczo, jest to wątek blokowania na take()
funkcjonowania kolejki wywołań zwrotnych że obiekt słuchacza każdym razem operacja take()
powiedzie, ewentualnie odesłanie specjalną cookie
obiekt (zignorować, jeśli chcesz).
Pytanie brzmi: czy istnieje lepszy sposób na zrobienie tego? Czy popełniam niewybaczalny błąd (zarówno pod względem współbieżności/wydajności i/lub czystości kodu)? Z góry dziękuję.
Podoba mi się. Jedynym problemem jest to, jak mogę go podklasować, ponieważ nie lubię ograniczać się do konkretnej implementacji BlockingQueue ... tj. Jeśli mam podklasę LinkedBlockingQueue, to jestem związany z tą implementacją. Czy powinienem zrobić "dekoratora"? – gd1
Tak, dekorator brzmi jak dobry pomysł na ten problem –