2015-06-21 58 views
1

当前正在for循环中处理的元素,队列的头部?Java ConcurrentLinkedQueue迭代元素顺序?

private Queue<User> users = new ConcurrentLinkedQueue<User>(); 

for(User u : users){ 
    users.remove(); // <- is this removing the currently iterated element? 
} 

或者在这里使用users.remove(u)最好?

+0

[javadoc remove()](http://docs.oracle.com/javase/7/docs/api/java/util/Queue.html#remove%28%29)说:*检索并移除该队列的头部*。什么不清楚? –

+0

我在单独的线程中使用了多个for循环,并且想知道队列的头是否是下一个元素或迭代的元素。 – ThatGuy343

+1

队列的头部是队列的头部。就像当人们排队等候公车时,第一个人就是队列的头部。无论你是否在队列上迭代都不会改变“head”的定义。 –

回答

2

是的,这对ConcurrentLinkedQueue<E>是正确的,因为它以FIFO顺序对元素进行排序。

docs

此队列订单元素FIFO(先入先出)。 队列的头部是在队列中最长时间的元素。队列尾部的 是该队列中最短时间的元素。

+0

这不会**意味着调用去除将永远删除元素正在迭代。 – immibis

+0

有意详细评论吗?在答案中指出,迭代是针对插入顺序完成的,因为该集合保持FIFO排序。此外,从文档中引用关于remove:public E remove() 检索并删除此队列的头部。此方法与轮询的区别仅在于,如果此队列为空,则会引发异常。 该实现返回轮询结果,除非队列为空。 – John

+0

正如我在对这个问题的评论中所说的:如果在此循环运行时另一个线程调用remove,那么迭代器将与队列头部不同步。 – immibis