【发布时间】:2011-12-04 03:13:24
【问题描述】:
来自ArrayBlockingQueueArrayBlockingQueue的Javadoc:
添加
公共布尔加法(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.
我一直将这句话(if it is possible to do so immediattely)解释如下:
如果队列有空闲容量,则插入将成功。如果没有空白空间,则不会成功。
但我的理解在这里是错误的。
在一个简单的例子中,我决定使用ArrayBlockingQueue,例如20 个元素(小队列)并有一个线程在做:
queue.take()
尽管队列几乎是空的,但另一个线程没有通过add 方法将元素添加到队列中。
我也通过调试验证了它。
一旦我将queue.add(element) 的调用替换为queue.put(element),该元素确实已添加到队列中。
那么这些方法有什么不同呢?
还有什么其他原因(除了容量)不能添加?
更新:
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 只是 String 值的持有者。
public class ConnectionObject {
private String user;
private String ip;
//etc
}
消费者:
public class ConnectionTreeUpdater extends Thread {
@Override
public void run() {
while(true){
try {
final ConnectionObject con = ConnectionListener.queueConnections.take();
如果我使用add,则不会引发异常,但不会将元素添加到队列中。
只是一个想法:也许由于消费者正在队列中“等待”,如果某些内部管家无法添加元素,则不会添加它并且不会引发异常。可能是这种情况。
否则我无法理解为什么没有异常并且使用put 代码有效。
put 和 add 的使用方式是否不同?
【问题讨论】:
-
我怀疑您正在捕获并忽略
add()引发的异常,但没有看到您的代码,这只是猜测。您需要发布一个小代码示例来展示您遇到的问题。 -
其实add里面也没有异常。我刚刚做了
queue.add,代码立即返回,没有添加元素,也没有异常 -
@user384706:我们能否看到一个完整且可重现的测试用例来演示此行为(
add()不会引发异常,但也不会将元素添加到队列中)。 -
不,它没有。它要么将其添加到队列中,要么引发异常。这是仅有的两种可能的结果。
-
@Brian: 用一些代码更新了帖子
标签: java multithreading data-structures concurrency queue