可以说我有大量的工作线程正在处理中,还有一个主管线程等待它们全部完成。传统上我可以这样做:如何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();
...这对我来说似乎很奇怪,因为我认为,一旦你检索了它与列表本身分开的迭代器。我的下一个想法是克隆迭代器或员工列表,以便它与原始更改列表分开,但我认为我会先给你专家一个镜头。
除非你正在编写一些并发框架,否则使用像* join()*这样的低级java特有的东西几乎没有任何意义。我有一个250 KLOC左右的代码库,这是一个多线程应用程序(在所有内核上进行数字处理并传播负载)的一个代码,我们正在使用像* join()*这样的低级事物,以及...... **零**时间。但是更高层次的构造,如* Java Concurrency in Practice *中详述的那些,我们一直在使用。它充满了'生产者'和'消费者',但* join()*不是一次。 – SyntaxT3rr0r 2011-06-06 21:45:47
同意你不应该使用'join'。你的代码存在问题:你永远不会'开始'将新的线程添加到列表中。如果你在别的地方启动它们,知道它是很重要的,因为它也需要同步。 – toto2 2011-06-06 23:10:24