问题描述
|
可以说我有大量工作线程都在积极处理,还有一个主管线程正在等待它们全部完成。传统上,我可以执行以下操作:
for(Worker w:staff){
w.start();
}
for(Worker w:staff){
w.join();
}
..一切都会很好。但是,在这种情况下,我的工作人员列表(ArrayList工作人员)的大小是可变的,并且可以在任意时间更改。我最好的知识告诉我,这样的事情应该起作用:
synchronized(this){
for(Worker w:staff){
w.start();
}
}
while(true){ //this loop will keep the supervisor running until all workers have stopped
//interrupts will occur when changes to the size of staff list occur
try{
Iterator<Worker> it;
synchronized(this){
it = staff.iterator();
}
while(it.hasNext()){
Worker w = it.next();
w.join();
}
return;
}catch(InterruptedException ie){continue;}
}
但是,这仍然会导致conncurrentModificationException
Worker w = it.next();
...在我看来,这很奇怪,因为我认为一旦检索到迭代器,它就会与列表本身分开。我的下一个想法是克隆迭代器或人员列表,以使其与原始更改列表分开,但是我想我会先给您提供专家意见。
解决方法
如果对“ 3”实例之外的基础集合进行了任何更改,则“ 3”实例将无效。
您为什么不考虑改用5英镑呢?使“ 6”实现“ 7”,然后使用服务的“ 8”方法之一。
CyclicBarrier
或CountDownLatch
是可用于构建相似功能的较低级工具。
, 当您尝试在迭代器部分完成时尝试修改列表时,会出现ConcurrentModificationException,但是在您的代码示例中,没有代码可以从列表中添加或删除列表,因此问题出在代码的其他地方。
基本上,在使用Interator时,不要从列表中删除或添加列表,如果必须删除,可以使用Iterator.remove()而不是List.remove()删除项目。