如何在大小变化的列表的所有元素上使用Thread.join()?

| 可以说我有大量工作线程都在积极处理,还有一个主管线程正在等待它们全部完成。传统上,我可以执行以下操作:
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()删除项目。     

要回复问题请先登录注册