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.
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?
Es ist wirklich ganz einfach:
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
:
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%Tags und Links java multithreading queue concurrency data-structures