阻止收集中的每一个

时间:2014-06-04 11:16:07

标签: java multithreading java.util.concurrent blockingqueue

假设我有一个LinkedBlockingQueue队列的实例;并希望每个人都使用这个队列:

for(Object obj : queue)  {

//do smth
}

如果此时队列为空,此代码如何处理?它会阻止运行,直到队列变为空或不是吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

不,它不会阻止(demo)。

Java的for - 每个循环从集合中获取iterator,并使用该迭代器遍历集合。根据{{​​3}},LinkedBlockingQueue<T>集合的迭代器反映了迭代器构造时队列的状态:

  

返回的迭代器是一个“弱一致”的迭代器,它永远不会抛出ConcurrentModificationException,并保证遍历构造迭代器时存在的元素。

由于在构造迭代器时队列为空,因此迭代器不会等待更多数据变为可用,并报告它没有其他元素。当然,如果在构造迭代器之后集合变为非空,则迭代器可能返回一些新插入的项。

答案 1 :(得分:1)

它不会阻塞,它根本不会进入循环分支。

您可以轻松查看:

LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
for (Object obj : queue) {
    System.out.println("Inside the loop, is empty? " + queue.isEmpty());
}
System.out.println("Not blocking, is empty? " + queue.isEmpty());

输出:Not blocking, is empty? true