Из 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's capacity, returning true
upon success and throwing an IllegalStateException if this queue is full.
Я всегда интерпретировал это утверждение (часть if it is possible to do so immediattely
) следующим образом:
Если очередь имеет свободную емкость, вставка будет выполнена успешно.Если нет пустого места, то это не удастся.
Но мое понимание здесь было неверным.
В простом случае, когда я решил использовать ArrayBlockingQueue
, например, для 20 элементов (небольшая очередь) и один поток выполняет:
queue.take()
другойпоток не добавил элемент в очередь с помощью метода add
, хотя очередь была почти пустой.
Я также проверил это с помощью отладки.
Как только я заменил вызов queue.add(element)
на queue.put(element)
, элемент действительно был добавлен в очередь.
Так в чем же отличие этих методов?
По какой другой причине (помимо емкости) дополнение может не произойти?
ОБНОВЛЕНИЕ:
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
просто держатель для строковых значений.
public class ConnectionObject {
private String user;
private String ip;
//etc
}
И потребитель:
public class ConnectionTreeUpdater extends Thread {
@Override
public void run() {
while(true){
try {
final ConnectionObject con = ConnectionListener.queueConnections.take();
Если я использую add
, исключение не выдается, но элемент не добавляется в очередь.
Просто мысль: возможно, поскольку потребитель «ждет» в очереди, если для какой-то внутренней обработки элемент не может быть добавлен, он не будет добавлен, и не будет выдано исключение. Может ли это иметь место.
В противном случае я не могу понять, почему нет исключения, и с put
код работает.
Разве put
и add
предназначены для использования по-разному?