Từ Javadoc của ArrayBlockingQueue
ArrayBlockingQueue:ArrayBlockingQueue và thêm vs đặt vs công suất
thêm
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.
Tôi luôn interpretted tuyên bố này (một phần if it is possible to do so immediattely
) như sau:
Nếu hàng đợi có dung lượng miễn phí, khi đó chèn sẽ thành công. Nếu không có không gian trống thì nó sẽ không thành công.
Nhưng sự hiểu biết của tôi sai ở đây.
Trong trường hợp đơn giản, tôi quyết định sử dụng số ArrayBlockingQueue
cho ví dụ: 20 yếu tố (hàng đợi nhỏ) và có một thread thực hiện:
queue.take()
thread khác không thêm một yếu tố để xếp hàng thông qua phương thức add
mặc dù hàng đợi đã gần như trống rỗng.
Tôi đã xác minh nó cũng thông qua gỡ lỗi.
Khi tôi đã thay thế cuộc gọi queue.add(element)
thành queue.put(element)
yếu tố này thực sự đã được thêm vào hàng đợi.
Vậy các phương pháp này khác nhau như thế nào?
Vì lý do nào khác (ngoài năng lực), việc bổ sung có thể xảy ra không?
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
chỉ là một người giữ cho các giá trị String.
public class ConnectionObject {
private String user;
private String ip;
//etc
}
Và người tiêu dùng:
public class ConnectionTreeUpdater extends Thread {
@Override
public void run() {
while(true){
try {
final ConnectionObject con = ConnectionListener.queueConnections.take();
Nếu tôi sử dụng add
không phải ngoại lệ được ném nhưng yếu tố không được thêm vào hàng đợi.
Chỉ cần suy nghĩ: có lẽ vì người tiêu dùng đang "chờ" trên hàng đợi, nếu đối với một số dịch vụ vệ sinh nội bộ thì không thể thêm phần tử đó vào nó và không có ngoại lệ nào được ném.
Nếu không, tôi không thể hiểu tại sao không có ngoại lệ và với mã put
hoạt động.
Có phải put
và add
có nghĩa là được sử dụng khác nhau?
tôi nghi ngờ bạn bị bắt và bỏ qua ngoại lệ được ném bởi 'thêm()' nhưng không thấy mã của bạn chỉ là một phỏng đoán. Bạn cần đăng một ví dụ mã nhỏ thể hiện sự cố bạn đang gặp phải. –
Trên thực tế không có ngoại lệ trong phần bổ sung. Tôi chỉ làm 'queue.add' và mã trả về immediatelly mà không thêm phần tử và không có ngoại lệ – Cratylus
@ user384706: Chúng ta có thể xem một trường hợp kiểm tra đầy đủ và có thể tái tạo để chứng minh hành vi này (' add() 'không ném ngoại lệ không thêm phần tử vào hàng đợi). – NPE