Как правило, вы не можете изменять коллекции, пока выполняете их. Один из вариантов - создать отдельный список «изменений», которые вы хотите применить, и затем применить их после завершения итерации.
В качестве альтернативы, некоторые коллекции do поддерживают это, например ConcurrentLinkedQueue
, но большинство не дают никаких гарантий относительно того, увидит ли итератор изменения, сделанные во время итерации. (Я подозреваю, что это , в основном , потому что они также поточно-ориентированы, но я редко видел документированные гарантии того, что произойдет, если вы измените коллекцию в итерирующем потоке.)
РЕДАКТИРОВАТЬ: Я не уверен, что итератор является правильным подходом здесь. Вместо этого вы можете использовать:
while (!queue.isEmpty())
{
// Put logic in here - add, poll etc
}
Следует отметить, что ваш опубликованный код фактически не перемещает итератор вперед - он никогда не вызывает it.next()
. Это сильное предположение, что либо вы не используете итератор полностью, либо он вам вообще не нужен.