Da Javadoc di ArrayBlockingQueue
ArrayBlockingQueue:ArrayBlockingQueue e aggiungere vs put vs capacità
aggiungere
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.
ho sempre interpretato nel presente comunicato (il parte if it is possible to do so immediattely
) come segue:
Se la coda ha capacità libera, l'inserimento avrà esito positivo. Se non c'è spazio vuoto, non ci riuscirà.
Ma la mia comprensione era sbagliata qui.
In un caso semplice ho deciso di utilizzare uno ArrayBlockingQueue
per es. 20 elementi (piccola coda) e aventi un filo facendo:
queue.take()
l'altro filo non aggiungere un elemento alla coda tramite il metodo add
nonostante la coda era quasi vuoto.
Ho verificato anche tramite debug.
Dopo aver sostituito la chiamata di queue.add(element)
a queue.put(element)
, l'elemento è stato effettivamente aggiunto alla coda.
Quindi cosa c'è di così diverso in questi metodi?
Per quale altro motivo (oltre alla capacità) l'aggiunta non può avvenire?
UPDATE:
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
è solo un supporto per i valori stringa.
public class ConnectionObject {
private String user;
private String ip;
//etc
}
e il consumatore:
public class ConnectionTreeUpdater extends Thread {
@Override
public void run() {
while(true){
try {
final ConnectionObject con = ConnectionListener.queueConnections.take();
Se uso add
non viene generata un'eccezione, ma elemento non viene aggiunto alla coda.
Solo un pensiero: forse in quanto il consumatore è "in attesa" sulla coda, se per qualche servizio di pulizia interna l'elemento non può essere aggiunto che non verranno aggiunti e non fa eccezione è thrown.Could che essere il caso.
Altrimenti non riesco a capire perché non ci siano eccezioni e con put
il codice funziona.
Sono put
e add
destinati a essere utilizzati in modo diverso?
ho il sospetto che dovevamo prendere e ignorando l'eccezione di essere gettato da 'add()' ma senza vedere il tuo codice è solo una supposizione. Devi pubblicare un piccolo esempio di codice che mostri il problema che stai riscontrando. –
In realtà non ci sono state eccezioni in add. Ho appena fatto 'queue.add' e il codice restituito immediatamente senza aggiungere l'elemento e nessuna eccezione – Cratylus
@ user384706: Per favore possiamo vedere un test case completo e riproducibile che dimostra questo comportamento (' add() 'non lanciare un'eccezione ma anche non aggiungere l'elemento alla coda). – NPE