这是困扰我的并行问题的标准补救措施的序列
问题:这会导致并发问题。
如何解决这个问题?
如何在t1之后有效地停止更新线程?或者有没有任何标准的方法来解决这个问题? synchronizedList (Collections.synchronizedList(new ArrayList()))
会对此有所帮助吗?
修改: 我也知道CopyOnWriteArrayList。但是我专注于这个
上的简单ArrayList答案 0 :(得分:1)
您可以使用执行程序服务来创建和终止线程,以及解决并发性的CopyOnWriteArrayList。
private CopyOnWriteArrayList<someObject> someArrayList = new CopyOnWriteArrayList<someObject>();
...
class NodeStatusThread implements Runnable {
private ExecutorService UpdaterThreadExecutor = null;
private int numThrd = 20; //threads
private int timeout = 10; // ten-seconds
@Override
public void run() {
for (int i=0;i<numThrd; i++ ) {
UpdaterThreadExecutor.execute(new UpdaterThread());
}
UpdaterThreadExecutor.shutdown();
try{
//Wait for thread completion
if(!UpdaterThreadExecutor.awaitTermination(timeout, TimeUnit.SECONDS)){ //return false is timeout is surpassed
UpdaterThreadExecutor.shutdownNow(); //forces thread termination
}
}catch(InterruptedException e){
UpdaterThreadExecutor.shutdownNow();
}
}
}
...
class UpdaterThread implements Runnable {
@Override
public void run() {
omeArrayList.add(someObject);
someArrayList.remove(someObject);
}
}
答案 1 :(得分:0)
4 - 等待某个定义的时间(t1)让Updater线程继续进行更新。
这是您的设计错误的地方。您永远无法确定每个线程是否已完成更新列表。
您应该使用同步机制,以允许您的消费者线程等到每个生产者完成。