假设我有大量工作线程都在积极处理,还有一个主管线程等待它们全部完成。传统上我可以做类似的事情:
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();
...这对我来说似乎很奇怪,因为我认为一旦您检索到迭代器,它就会与列表本身分开。我的下一个想法是克隆迭代器或人员列表,使其与原始更改列表分开,但我想我会先让专家们了解一下。