Android:两个线程之间的共享列表

时间:2015-07-29 09:57:31

标签: java android multithreading arraylist

我正在做一个应用程序,其中有2个视图从SurfaceView扩展,称为CanvasView。

我有一个左CanvasView和一个正确的CanvasView。 这两个CanvasView实例化一个UIThread,它从Thread扩展。 CanvasView本身就像这样传递给线程:

public void surfaceCreated(SurfaceHolder holder) {
  uiThread = new UIThread(this);
  uiThread.setRunning(true);
  uiThread.start(); 
}

在每个CanvasView,onDraw()中,我都可以访问列表。此列表基本上由要绘制的事物列表组成,这些列表在左侧和右侧画布上基本相同。

for (CharSequence line : lineList) {
... 
..
}

每当我的应用程序需要在lineList中绘制项目时,它就崩溃了 java.util.ConcurrentModificaitonException。

"分享"的正确方法是什么?两个线程之间的Arraylist lineList?

谢谢。

3 个答案:

答案 0 :(得分:1)

ArrayList课程不是Thread Safe

使用Collections.synchronizedList()代替ArrayList

答案 1 :(得分:1)

请勿使用简化版的for循环

for (CharSequence line : lineList) {
    ... 
    ..
}

相反,使用传统的。但是,您必须自己处理数据一致性。

for (int i = 0; i < lineList.size(); i++) {
    CharSequence line = lineList.get(i)
    ..
}

答案 2 :(得分:1)

列表不是线程安全的,当多个线程尝试修改同一个列表时,它最终会出现并发修改异常。

使用ConcurrentLinkedQueueCopyOnWriteArrayList

请参阅链接 - Is there a concurrent List in Java's JDK?

Collections.synchronizedList()是另一种提供对列表的同步访问的替代方案。