From the Javadoc ArrayBlockingQueue ArrayBlockingQueue :
add
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 capacity, returning true upon success and throwing an IllegalStateException if this queue is full.
I have always interpreted this statement (part of if it is possible to do so immediattely ) as follows:
If the queue has free capacity, then the insert will succeed. If there is no empty space, then this will not succeed.
But my understanding here was not so.
In the simple case, when I decided to use ArrayBlockingQueue , for example. 20 elements (small queue) and one thread:
queue.take()
another thread did not add the item to the queue using the add method, although the queue was almost empty.
I also checked this with debugging.
As soon as I replaced the call to queue.add(element) with queue.put(element) , the element was indeed added to the queue.
So, what is different from the methods in this?
For what other reason (besides capacity) can this addition happen?
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 is just a holder for String values.
public class ConnectionObject { private String user; private String ip;
And the consumer:
public class ConnectionTreeUpdater extends Thread { @Override public void run() { while(true){ try { final ConnectionObject con = ConnectionListener.queueConnections.take();
If I use add , an exception is not thrown, but the item is not added to the queue.
Just a thought: itβs possible, since the consumer is βwaitingβ in line, if for some internal homework an element cannot be added, it will not be added, and no exception will be thrown. Maybe so.
Otherwise, I canβt understand why there is no exception, and the code works with put .
Are put and add differently?