Ho bisogno di un Object
per essere avvisato in modo asincrono quando alcuni BlockingQueue
hanno un articolo da fornire.Notifica asincrona di un BlockingQueue con un articolo disponibile
Ho cercato sia Javadoc e il web per una soluzione pre-fatto, quindi ho finito con una soluzione (forse ingenua) di mine, qui è:
interface QueueWaiterListener<T> {
public void itemAvailable(T item, Object cookie);
}
e
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) {
}
}
}
}
Fondamentalmente, c'è un blocco di thread su un'operazione take()
di una coda che richiama un oggetto listener ogni volta che un'operazione take()
riesce, facoltativamente inviando un oggetto speciale cookie
(ignorarlo se lo si desidera).
La domanda è: c'è un modo migliore per farlo? Sto facendo un errore imperdonabile (sia in concorrenza/efficienza e/o pulizia del codice)? Grazie in anticipo.
Mi piace. L'unico problema è che come posso creare una sottoclasse, perché non mi piace legarmi a un'implementazione specifica di BlockingQueue ... cioè se sottoclassi LinkedBlockingQueue, allora sono legato a questa implementazione. Dovrei fare un "decoratore"? – gd1
Sì, un decoratore sembra una buona idea per questo problema –