ArrayBlockingQueue und add vs vs vs Kapazität

8

Aus Javadoc von ArrayBlockingQueue ArrayBlockingQueue :

  

hinzufügen

     

public boolean add (E e)

%Vor%

Ich habe diese Aussage (den Teil if it is possible to do so immediattely ) immer wie folgt interpretiert:

  

Wenn die Warteschlange freie Kapazität hat, ist die Einfügung erfolgreich. Wenn es keinen leeren Platz gibt, 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 Warteschlange) und mit einem Thread tun:

queue.take()

Der andere Thread hat der Warteschlange kein Element über die Methode add hinzugefügt, obwohl die Warteschlange fast leer war.

Ich habe es auch über das Debugging verifiziert.

Nachdem ich den Aufruf von queue.add(element) auf queue.put(element) ersetzt habe, wurde das Element tatsächlich zur Warteschlange hinzugefügt.

Was ist also so anders an diesen Methoden?

Aus welchem ​​anderen Grund (neben der Kapazität) könnte die Addition nicht geschehen?

UPDATE:

%Vor%

ConnectionObject ist nur ein Halter für String-Werte.

%Vor%

Und der Verbraucher:

%Vor%

Wenn ich add verwende, wird keine Ausnahme ausgelöst, aber das Element wird nicht zur Warteschlange hinzugefügt.

Nur ein Gedanke: vielleicht, weil der Verbraucher in der Warteschlange "wartet", wenn für ein internes Housekeeping das Element nicht hinzugefügt werden kann, wird es nicht hinzugefügt, und es wird keine Ausnahme geworfen. Das könnte der Fall sein.

Ansonsten kann ich nicht verstehen, warum es keine Ausnahme gibt und mit put funktioniert der Code.

Sollen put und add anders verwendet werden?

    
Cratylus 09.10.2011, 21:27
quelle

2 Antworten

14

Es ist wirklich ganz einfach:

  • Wenn die Warteschlange nicht voll ist, sind beide Methoden erfolgreich;
  • Wenn die Warteschlange voll ist, add() schlägt mit einer Ausnahme fehl, während put() Blöcke.

Ich denke, die Dokumentation ist ziemlich klar auf dem oben genannten. Wenn Sie nicht einverstanden sind und eine zweite Meinung wünschen, können Sie den Quellcode für ArrayBlockingQueue :

prüfen %Vor%     
NPE 09.10.2011, 21:35
quelle
3

Einer der wichtigeren Teile des Debuggens eines Problems ist das Schreiben eines Testfalls , um sicherzustellen, dass das, was Sie gerade denken, tatsächlich passiert. Dies beweist oder widerlegt Ihre Theorie.

Der folgende Testfall zeigt, dass sich die von Ihnen verwendeten Methoden genauso verhalten wie die Dokumentation (die Sie angeben):

%Vor%     
Brian Roach 10.10.2011 00:01
quelle