ArrayBlockingQueue et ajouter vs mettez vs capacité

De Javadoc de ArrayBlockingQueue ArrayBlockingQueue:

ajouter

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.

J'ai toujours interpretted cette déclaration (la partie if it is possible to do so immediattely) comme suit:

Si la file d'attente dispose d'un espace libre, puis l'insérer réussira. Si il n'y a pas d'espace vide alors elle ne réussira pas.

Mais ma compréhension était mal ici.

Dans un cas simple que j'ai décidé d'utiliser un ArrayBlockingQueue pour, par exemple, de 20 éléments (petite file d'attente) et ayant un thread:

queue.take()

l'autre thread n'a pas d'ajouter un élément à la file d'attente via le add méthode malgré la file d'attente était presque vide.

J'ai vérifié également par l'intermédiaire de débogage.

Une fois, j'ai remplacé l'appel de queue.add(element) à queue.put(element) l'élément est en effet ajouté à la file d'attente.

Donc ce qui est différent dans ces méthodes?

Pour quelle autre raison (en plus de la capacité) pourrait le plus se produit pas?


Mise à JOUR:

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 est juste un support pour des valeurs de Chaîne.

public class ConnectionObject {
  private String user;  
  private String ip;
   //etc  
}

Et le consommateur:

public class ConnectionTreeUpdater extends Thread {  
  @Override
  public void run() {
    while(true){  
    try {  
    final ConnectionObject con = ConnectionListener.queueConnections.take();

Si j'utilise add aucune exception n'est levée, mais l'élément n'est pas ajouté à la file d'attente.

Juste une pensée: peut-être, car le consommateur est "en attente" dans la file d'attente, si pour une gestion interne de l'élément ne peut pas être ajoutée, elle ne sera pas ajoutée et aucune exception n'est levée.Pourrait-ce être le cas.

Sinon, je ne comprends pas pourquoi il n'y a pas d'exception et avec put le code fonctionne.

Sont put et add destiné à être utilisé différemment?

Je soupçonne que vous avez été la capture et ignorant l'exception levée par add() mais sans voir ton code c'est juste une supposition. Vous avez besoin d'afficher un petit exemple de code illustrant le problème que vous rencontrez.
En fait il n'y a pas d'exception à ajouter. J'ai juste fait queue.add et le code renvoyé immédiatement, sans l'ajout de l'élément et non l'exception
Veuillez peut-on voir un complet et reproductible de cas de test qui illustre ce comportement (add() pas lancer une exception, mais aussi de ne pas ajouter l'élément à la file d'attente).
Non, il n'a pas. Qu'il soit ajouté à la file d'attente, ou il a jeté une exception. Ce sont les deux seules issues possibles.
post avec un peu de code

OriginalL'auteur Cratylus | 2011-10-09