2015-06-21 3 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 of remove()] (http://docs.oracle.com/javase/7/docs/api/java/util/Queue.html#remove%28%29) говорит: * Извлекает и удаляет головку этой очереди *. Что непонятно? –

+0

Я использую несколько циклов в отдельных потоках и задавался вопросом, был ли глава очереди либо следующим элементом, либо элементом, который повторяется. – ThatGuy343

+1

Глава очереди - это очередь очереди. Точно так же, когда люди формируют очередь для ожидания автобуса, первым лицом является очередь очереди. Если вы выполняете итерацию в очереди или нет, это не изменяет определение «head». –

ответ

2

Да, это правильно для ConcurrentLinkedQueue<E>, так как он заказывает элементы в порядке FIFO.

От docs:

Это упорядочивает очереди элементов FIFO (первый в первый вышел). Глава очереди - это тот элемент, который был в очереди самым длинным. Конец очереди - это тот элемент, который был в очереди .

+0

Это означает ** НЕ ** означает, что вызов 'remove' всегда будет удалять причем элемент повторяется. – immibis

+0

Ухаживать за комментариями? В ответе утверждается, что итерация выполняется в отношении порядка вставки, поскольку эта коллекция поддерживает упорядочение FIFO. Кроме того, цитата из документов относительно удаления: public E remove() Извлекает и удаляет головку этой очереди. Этот метод отличается от опроса только тем, что он генерирует исключение, если эта очередь пуста. Эта реализация возвращает результат опроса, если очередь не пуста. – John

+0

Как я уже сказал в комментарии к вопросу: если другой поток вызывает 'remove', когда этот цикл запущен, то итератор будет не синхронизироваться с головой очереди. – immibis

Смежные вопросы