对于同时增长的列表中的每个循环

She*_*lef 3 java multithreading list arraylist

我在java中有一个for-each循环.

for-each myList在一个线程中运行.myList可以同时成长.我有一些问题:

  1. 如果我启动了for-each循环并且在它启动之后,一个项目被添加到列表中,for-each循环中的动作是否会在它上面运行?
  2. 假设上述问题的答案是否定的.我有点问题.for-each循环处于while(true)循环中,因此它将重新开始.我希望for-each循环在每个项目上运行一次.我无法在for-each循环中删除项目,因为我得到了ConcurrentModificationException.所以我的解决方案是在for-each循环结束后删除所有列表项.但是,这样一来,如果在for-each循环启动后添加到列表中的项目也被删除了,则for-each循环将永远不会在此项目上运行.

我的目标是在一个可以同时增长的列表上运行for-each.我希望for-each循环永远不会错过任何项目,并且永远不会在同一项目上运行两次或更多次.解决办法是什么?

Sea*_*man 6

使用Iterator.remove将允许您不要点击ConcurrentModificationException,但另一种解决方案是不使用foreach循环并简单地循环,例如:

// assuming that this is a list of Strings
List<String> list = ...
while(!list.isEmpty())) {
    String data = list.remove(0);
    ...process data...
}
Run Code Online (Sandbox Code Playgroud)

这将允许您处理添加到列表中的每个项目,并且只执行一次.上面有一个小窗口,但isEmpty可以返回true,并且可以将新项添加到列表中(这可能发生在多线程环境中).

  • 或者在while语句中使用像LinkedBlockingQueue和poll这样的并发集合 (2认同)