在返回LIST时避免可能的并发问题

时间:2015-03-31 17:52:25

标签: java multithreading arraylist concurrency

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

  1. 创建一个列表对象(lst)
  2. 启动多线程(更新程序线程)
  3. 将lst发送到每个更新程序线程以更新(添加)它。
  4. 等待某个定义的时间(t1)让Updater线程继续进行更新。
  5. 在t1时间过后,将lst返回给我们无法控制的另一个应用程序(Consumer-App)。
  6. 返回时,Updater Threads可能仍在更新lst。
  7. Consumer-App并不知道更新程序主题是否仍在后台更新列表。
  8. Consumer-App在lst。
  9. 上列出操作(添加/删除)

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

    如何解决这个问题?

    如何在t1之后有效地停止更新线程?或者有没有任何标准的方法来解决这个问题? synchronizedList (Collections.synchronizedList(new ArrayList()))会对此有所帮助吗?

    修改: 我也知道CopyOnWriteArrayList。但是我专注于这个

    上的简单ArrayList

2 个答案:

答案 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线程继续进行更新。

这是您的设计错误的地方。您永远无法确定每个线程是否已完成更新列表。

您应该使用同步机制,以允许您的消费者线程等到每个生产者完成。

使用CountDownLatchCyclicBarrier