Od Javadoc z ArrayBlockingQueue
ArrayBlockingQueue:ArrayBlockingQueue i dodać vs put vs pojemności
dodać
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.
zawsze interpretowana to oświadczenie (the część if it is possible to do so immediattely
) w następujący sposób:
Jeśli kolejka ma wolną pojemność, to wstawianie zakończy się pomyślnie. Jeśli nie ma pustej przestrzeni, to się nie uda.
Ale moje zrozumienie było tutaj złe.
W prostym przypadku, w którym zdecydowałem się użyć ArrayBlockingQueue
dla np. 20 elementy (mała kolejka) i ma jedną nić idzie:
queue.take()
inny wątek nie dodać element do kolejki metodą add
pomimo kolejki prawie pusty.
Sprawdziłem to również poprzez debugowanie.
Po zastąpieniu połączenia z queue.add(element)
na queue.put(element)
element rzeczywiście został dodany do kolejki.
Czym w takim razie różni się od metod?
Z jakiego innego powodu (oprócz zdolności produkcyjnej) dodatek może się nie wydarzyć?
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
jest tylko uchwyt do wartości String.
public class ConnectionObject {
private String user;
private String ip;
//etc
}
i konsumenta:
public class ConnectionTreeUpdater extends Thread {
@Override
public void run() {
while(true){
try {
final ConnectionObject con = ConnectionListener.queueConnections.take();
Jeśli używam add
nie jest wyjątek, lecz elementem nie zostanie dodany do kolejki.
Pomyślnie: być może dlatego, że konsument czeka "w kolejce", jeśli do wewnętrznego porządkowania elementu nie można dodać, nie zostanie dodany i nie zostanie zgłoszony wyjątek. W takim przypadku.
W przeciwnym razie nie rozumiem, dlaczego nie ma wyjątków i kod put
działa.
Czy put
i add
mają być używane inaczej?
podejrzewam byłeś połowu i ignorowanie wyjątek wyrzucane przez 'add()' ale nie widząc twojego kodu, to tylko odgadnięcie. Musisz opublikować mały przykład kodu, demonstrujący występujący problem. –
W rzeczywistości nie było żadnego wyjątku. Właśnie zrobiłem 'queue.add' i kod został natychmiast zwrócony bez dodawania elementu i bez wyjątku – Cratylus
@ user384706: Czy możemy zobaczyć kompletny i powtarzalny przypadek testowy, który demonstruje to zachowanie (' add() 'nie rzuca wyjątku, ale także nie dodawanie elementu do kolejki). – NPE