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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eigentlich ganz einfach:
add()
schlägt mit einer Ausnahme fehl in der Erwägung, dassput()
Blöcke.Ich denke die Dokumentation ist ziemlich klar, auf der oben. Wenn Sie damit nicht einverstanden, und möchte eine zweite Meinung, man könnte untersuchen Sie die Quelle code für
ArrayBlockingQueue
:If you find the documentation ambiguous, you can verify this by looking at the source code
- Nun, es gibt einen Unterschied zwischen einem detail und Dokumentation, so bin ich nicht wirklich glücklich mit, dass die Beratung im Allgemeinen. Wenn die Dokumentation nicht klar ist (obwohl ich denke, es ist ziemlich klar, in diesem Fall), das ein bug ist eher sinnvoll denke ich (noch nicht gemacht, dass für Java, aber mehr als einmal für msdn [sowie die win32-api-doc ist ein Chaos, obwohl ;-)])Einer der wichtigsten Teile der debugging-problem ist schreiben einen test-Fall, um sicherzustellen, was Sie denken, ist passiert, ist tatsächlich passiert. Entweder beweist oder widerlegt Ihre Theorie.
Den Testfall zeigt, dass die Methoden, die Sie verwenden, Verhalten sich genau wie in der Dokumentation (die Sie zitieren) Staaten: