ArrayBlockingQueue und fügen Sie vs-stellen, vs-Kapazität

Aus der Javadoc von ArrayBlockingQueue ArrayBlockingQueue:

hinzufügen

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.

Ich immer interpretted diese Aussage (der Teil if it is possible to do so immediattely) wie folgt:

Wenn die Warteschlange hat freie Kapazität, dann wird das insert erfolgreich sein wird. Wenn es keinen leeren Raum gibt, dann wird es nicht gelingen.

Aber mein Verständnis war hier falsch.

In einem einfachen Fall, dass ich mich entschieden habe, ein ArrayBlockingQueue für z.B. 20 Elemente (kleine Schlange) und mit einem thread zu tun:

queue.take()

den anderen thread nicht fügen Sie ein element in der queue über die add Methode trotz der Warteschlange war fast leer.

Ich überprüft, dass es auch über debugging.

Einmal ersetzte ich den Anruf von queue.add(element) zu queue.put(element) element wurde in der Tat der Warteschlange Hinzugefügt.

Also, was ist so anders in diesen Methoden?

Für welchen anderen Grund (außer der Kapazität), könnte der Zusatz nicht passieren?


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 ist nur ein Platzhalter für String-Werte.

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

Und die Verbraucher:

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

Wenn ich add es wird keine exception geworfen, sondern element nicht der Warteschlange Hinzugefügt.

Nur so ein Gedanke: vielleicht da der Verbraucher ist "warten" in der Warteschlange, wenn für einige interne housekeeping-das element kann nicht Hinzugefügt werden, es wird nicht Hinzugefügt und es wird keine exception geworfen.Könnte das der Fall sein.

Ansonsten kann ich nicht verstehen, warum es ist keine Ausnahme, und mit put code funktioniert.

Sind put und add soll anders genutzt werden?

  • Ich vermute, Sie waren zu fangen und ignorieren dabei, dass die Ausnahme ausgelöst wird, durch add() aber ohne zu sehen, Ihren code, ist nur eine Vermutung. Sie müssen die post ein kleines code-Beispiel zeigt das problem, das Sie haben.
  • Eigentlich gab es keine Ausnahme hinzufügen. Ich habe gerade queue.add und den code zurückgegeben immediatelly ohne das hinzufügen das element und keine Ausnahme
  • Bitte können wir sehen, eine vollständige und reproduzierbare test-Fall, der zeigt dieses Verhalten (add() nicht eine Ausnahme zu werfen, aber auch nicht hinzufügen, das element der Warteschlange).
  • Nein, das ist es nicht. Es wird entweder Hinzugefügt, um die Warteschlange, oder es hat eine Ausnahme ausgelöst. Das sind die nur zwei mögliche Ergebnisse.
  • post mit dem code
  • Hinzugefügt der wichtigste Teil des Codes.Wird versuchen einen vollständigen Testfall in eine kleine Weile

InformationsquelleAutor Cratylus | 2011-10-09
Schreibe einen Kommentar