Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:在两个线程之间共享列表_Java_Android_Multithreading_Arraylist - Fatal编程技术网

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

Java Android:在两个线程之间共享列表,java,android,multithreading,arraylist,Java,Android,Multithreading,Arraylist,我正在做一个应用程序,其中我有两个从SurfaceView扩展的视图,叫做CanvasView 我有左视图和右视图。 这两个CanvasView都实例化了一个UIThread,它从线程扩展而来。 CanvasView本身被传递到线程中,如下所示: public void surfaceCreated(SurfaceHolder holder) { uiThread = new UIThread(this); uiThread.setRunning(true); uiThread.st

我正在做一个应用程序,其中我有两个从SurfaceView扩展的视图,叫做CanvasView

我有左视图和右视图。 这两个CanvasView都实例化了一个UIThread,它从线程扩展而来。 CanvasView本身被传递到线程中,如下所示:

public void surfaceCreated(SurfaceHolder holder) {
  uiThread = new UIThread(this);
  uiThread.setRunning(true);
  uiThread.start(); 
}
在每个CanvasView,onDraw()中,我访问一个列表。这个列表基本上由一个要绘制的事物的列表组成,在左画布和右画布上基本相同

for (CharSequence line : lineList) {
... 
..
}
每当我的应用程序需要在lineList中绘制项目时,它就会崩溃 java.util.ConcurrentModificaitoneException

在两个线程之间“共享”Arraylist行列表的正确方法是什么


谢谢。

不支持
ArrayList


使用
Collections.synchronizedList()
而不是
ArrayList

类不可用


使用
Collections.synchronizedList()
而不是
ArrayList

类不可用


使用
Collections.synchronizedList()
而不是
ArrayList

类不可用


使用
Collections.synchronizedList()
而不是
ArrayList

不要使用for循环的简化版本

for (CharSequence line : lineList) {
    ... 
    ..
}
相反,使用传统的方法。但是,您必须自己处理数据一致性

for (int i = 0; i < lineList.size(); i++) {
    CharSequence line = lineList.get(i)
    ..
}
for(int i=0;i
不要使用for循环的简化版本

for (CharSequence line : lineList) {
    ... 
    ..
}
相反,使用传统的方法。但是,您必须自己处理数据一致性

for (int i = 0; i < lineList.size(); i++) {
    CharSequence line = lineList.get(i)
    ..
}
for(int i=0;i
不要使用for循环的简化版本

for (CharSequence line : lineList) {
    ... 
    ..
}
相反,使用传统的方法。但是,您必须自己处理数据一致性

for (int i = 0; i < lineList.size(); i++) {
    CharSequence line = lineList.get(i)
    ..
}
for(int i=0;i
不要使用for循环的简化版本

for (CharSequence line : lineList) {
    ... 
    ..
}
相反,使用传统的方法。但是,您必须自己处理数据一致性

for (int i = 0; i < lineList.size(); i++) {
    CharSequence line = lineList.get(i)
    ..
}
for(int i=0;i
列表不是线程安全的,当多个线程试图修改同一列表时,它将以并发修改异常结束

使用
ConcurrentLinkedQueue
CopyOnWriteArrayList

请参阅以下链接-


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

列表不是线程安全的,当多个线程尝试修改同一列表时,它将导致并发修改异常

使用
ConcurrentLinkedQueue
CopyOnWriteArrayList

请参阅以下链接-


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

列表不是线程安全的,当多个线程尝试修改同一列表时,它将导致并发修改异常

使用
ConcurrentLinkedQueue
CopyOnWriteArrayList

请参阅以下链接-


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

列表不是线程安全的,当多个线程尝试修改同一列表时,它将导致并发修改异常

使用
ConcurrentLinkedQueue
CopyOnWriteArrayList

请参阅以下链接-



Collections.synchronizedList()是另一个选项,它将提供对列表的同步访问。

嗨,Jason,对不起,这两者之间有什么区别?第一个是编译器。由于列表是一个集合,编译器使用迭代器转换for循环。迭代器是引发异常的人。但是,如果将数据存储在数组中,则不会引发异常。如果您的数据是一个简单数组,编译器将使用常规for循环。嗨,Jason,对不起,这两者之间有什么区别?第一个是编译器。由于列表是一个集合,编译器使用迭代器转换for循环。迭代器是引发异常的人。但是,如果将数据存储在数组中,则不会引发异常。如果您的数据是一个简单数组,编译器将使用常规for循环。嗨,Jason,对不起,这两者之间有什么区别?第一个是编译器。由于列表是一个集合,编译器使用迭代器转换for循环。迭代器是引发异常的人。但是,如果将数据存储在数组中,则不会引发异常。如果您的数据是一个简单数组,编译器将使用常规for循环。嗨,Jason,对不起,这两者之间有什么区别?第一个是编译器。由于列表是一个集合,编译器使用迭代器转换for循环。迭代器是引发异常的人。但是,如果将数据存储在数组中,则不会引发异常。如果您的数据是一个简单数组,编译器将使用常规for循环。感谢我的问题是使用CopyOnWriteArrayList和Erm解决的,没有使用那么多线程XDHi@lppier,您可以在onDraw中使用CopyOnWriteArrayList。您没有性能问题吗?@JasonChueh没有注意到任何问题,还有其他选择吗?@lppier,我只是想知道您是否面临任何问题。如果没有,这应该是一个很好的解决方案:)谢谢我的问题是使用CopyOnWriteArrayList和Erm解决的,没有使用那么多线程XDHi@lppier,您可以在onDraw中使用CopyOnWriteArrayList。您没有性能问题吗?@JasonChueh没有注意到任何问题,还有其他选择吗?@lppier,我只是想知道您是否面临任何问题。如果没有,这应该是一个很好的解决方案:)Tha