De Javadoc de ArrayBlockingQueue
ArrayBlockingQueue:ArrayBlockingQueue y añadir vs puesto vs capacidad
añadir
public boolean add (E e)
Inserts the specified element at the tail of this queue if it is possible to do so immediately without exceeding the queue's capacity, returning true upon success and throwing an IllegalStateException if this queue is full.
siempre interpretted esta declaración (la parte if it is possible to do so immediattely
) de la siguiente manera:
Si la cola tiene capacidad libre, la inserción tendrá éxito. Si no hay espacio vacío, no tendrá éxito.
Pero entendí mal aquí.
En un caso simple que decidí usar un ArrayBlockingQueue
por ej. 20 elementos (pequeña cola) y que tiene el hacer un hilo:
queue.take()
el otro hilo no añadir un elemento a la cola a través del método add
a pesar de la cola estaba casi vacío.
Lo he verificado también a través de la depuración.
Una vez que reemplacé la llamada de queue.add(element)
a queue.put(element)
, el elemento realmente se agregó a la cola.
Entonces, ¿qué es tan diferente en estos métodos?
¿Por qué otra razón (además de la capacidad) podría la adición no suceder?
ACTUALIZACIÓN:
public class ConnectionListener implements Observer {
public static BlockingQueue<ConnectionObject> queueConnections = new ArrayBlockingQueue<ConnectionObject>(10);
@Override
public void update(Observable arg0, Object arg1) {
ConnectionObject con = ((ConnectionObject)arg1);
queueConnections.add(con);
}
}
ConnectionObject
es sólo un soporte para valores de cadena.
public class ConnectionObject {
private String user;
private String ip;
//etc
}
Y el consumidor:
public class ConnectionTreeUpdater extends Thread {
@Override
public void run() {
while(true){
try {
final ConnectionObject con = ConnectionListener.queueConnections.take();
Si uso add
no es una excepción es lanzada, pero no consigue elemento añadido a la cola.
Solo un pensamiento: tal vez porque el consumidor está "esperando" en la cola, si no se puede agregar el elemento no se agregará y no se lanzará ninguna excepción. Podría ser el caso.
De lo contrario, no puedo entender por qué no hay excepción y con put
el código funciona.
Son put
y add
destinados a ser utilizados de manera diferente?
sospecho que capturaban e ignorando la excepción de ser lanzado por 'add()' pero sin ver tu código solo es una suposición. Debe publicar un pequeño ejemplo de código que demuestre el problema que está teniendo. –
En realidad no hubo excepción en add. Acabo de hacer 'queue.add' y el código retornó inmediatamente sin agregar el elemento y sin excepción – Cratylus
@ user384706: Por favor, podemos ver un caso de prueba completo y reproducible que demuestre este comportamiento (' add() 'no arroje una excepción sino también no agregando el elemento a la cola). – NPE