LinkedBlockingQueue和addAll()

时间:2019-12-24 20:22:47

标签: java

如果尝试将集合添加到阻止队列的过程超出了阻止队列的剩余大小,那么应该怎么办?从到目前为止我阅读的文档中还不清楚。

LinkedBlockingQueue<Integer> foo = new LinkedBlockingQueue<Integer>(3);
foo.add(1);
foo.add(2);
foo.addAll(collectionWith10elements);

3 个答案:

答案 0 :(得分:5)

add()的文档指出,如果队列已满,则会抛出IllegalStateException

  

如果可以立即将指定的元素插入此队列,而不会违反容量限制,则成功返回true,如果当前没有可用空间则抛出IllegalStateException

当您尝试以下代码时:

public static void main(String[] args) throws Exception {
    ArrayList<Integer> l = new ArrayList<Integer>();
    l.add(10);
    l.add(20);
    l.add(30);
    l.add(40);
    l.add(50);
    LinkedBlockingQueue<Integer> foo = new LinkedBlockingQueue<Integer>(3);
    foo.add(1);
    foo.add(2);
    foo.addAll(l);
}

您将收到以下异常:

Exception in thread "main" java.lang.IllegalStateException: Queue full
    at java.util.AbstractQueue.add(AbstractQueue.java:98)
    at java.util.AbstractQueue.addAll(AbstractQueue.java:187)
    at Test.main(Test.java:16)

答案 1 :(得分:1)

持久存储在队列中的元素应在达到容量后被消耗掉,否则我们将得到此异常:-

Exception in thread "main" java.lang.IllegalStateException: Queue full
    at java.util.AbstractQueue.add(AbstractQueue.java:98)
    at java.util.AbstractQueue.addAll(AbstractQueue.java:187)

答案 2 :(得分:1)

我在IDE上对其进行了测试,并且得到了

Exception in thread "main" java.lang.IllegalStateException: Queue full
    at java.util.AbstractQueue.add(AbstractQueue.java:98)
    at java.util.AbstractQueue.addAll(AbstractQueue.java:187)

如果您想了解更多信息,请转到here