假设我有一个LinkedBlockingQueue队列的实例;并希望每个人都使用这个队列:
for(Object obj : queue) {
//do smth
}
如果此时队列为空,此代码如何处理?它会阻止运行,直到队列变为空或不是吗?
谢谢!
答案 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