gpt4 book ai didi

java - 避免返回 LIST 时可能出现的并发问题

转载 作者:行者123 更新时间:2023-11-30 08:18:05 27 4
gpt4 key购买 nike

这是困扰我寻求并发问题的标准补救措施的序列

  1. 创建列表对象 (lst)
  2. 启动多个线程(更新程序线程)
  3. 将该 lst 发送到每个更新程序线程以更新(添加)它。
  4. 等待一段定义的时间 (t1),让更新程序线程继续更新。
  5. t1 时间到期后,将 lst 返回到不受我们控制的另一个应用程序(消费者应用程序)。
  6. 返回时,Updater Threads 可能仍在更新 lst。
  7. 消费者应用程序不知道更新程序线程是否仍在后台更新列表。
  8. 消费者应用程序在 lst 上执行列表操作(添加/删除)。

问题:这将导致并发问题。

如何解决这个问题?

如何在t1之后有效停止更新线程?或者有什么标准的方法来处理这个问题吗? synchronizedList (Collections.synchronizedList(new ArrayList())) 对此有帮助吗?

编辑:我也知道 CopyOnWriteArrayList 。但我关注的是简单的 ArrayList

最佳答案

您可以使用执行程序服务来创建和终止线程,以及解决并发问题的 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);
}
}

关于java - 避免返回 LIST 时可能出现的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29375205/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com