Necesito un Object
para ser notificado asíncrono cuando un BlockingQueue
tiene un artículo para dar.Al ser notificado asincrónicamente de un BlockingQueue que tiene un artículo disponible
He buscado tanto Javadoc y la web para una solución pre-hechos, entonces terminé con una solución (tal vez ingenua) mío, aquí está:
interface QueueWaiterListener<T> {
public void itemAvailable(T item, Object cookie);
}
y
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) {
}
}
}
}
Básicamente, hay un hilo de bloqueo en una operación take()
de una cola que las devoluciones de llamada un objeto detector cada vez que una operación tiene éxito take()
, opcionalmente devolver un objeto especial cookie
(ignorarlo si lo desea).
Pregunta es: ¿hay alguna forma mejor de hacerlo? ¿Estoy cometiendo algún error imperdonable (tanto en concurrencia/eficiencia y/o limpieza del código)? Gracias por adelantado.
Me gusta. El único problema es que cómo puedo crear una subclase, porque no me gusta vincularme a una implementación específica de BlockingQueue ... es decir, si subclasino LinkedBlockingQueue, entonces estoy obligado a esta implementación. ¿Debo hacer un "decorador"? – gd1
Sí, un decorador parece una buena idea para este problema –