微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在大小变化的列表的所有元素上使用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()删除项目。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。