我有主线程和ClientThread ...
在主线程中,当用户连接到服务器时,它将在ClientThread中调用方法
try {
Socket socket = server.accept();
clientThread.addClient(socket);
} catch(Exception e) {
e.printStackTrace();
}
ClientThread中的方法将内容添加到ArrayList
public void addClient(Socket socket) {
clientSockets.add(socket);
}
ClientThread还在每个帧上运行以下代码:
for (Socket socket : clientSockets) {
label.setText(socket.toString());
}
由于某种原因,我在此行
java.util.ConcurrentModificationException
上得到了这个错误for (Socket socket : clientSockets) {
...问题:为什么会出现此错误,我该如何解决?
最佳答案
您需要同步对clientSockets
的访问,因为在迭代过程中不允许更改List
的结构。
一个简单的解决方案是使clientSockets
成为同步的集合,然后在迭代之前对其进行显式同步:
List<Socket> clientSockets = Collections.synchronizedList(new ArrayList<Socket>());
//...when setting the labels:
synchronized (clientSockets) {
for ( Socket socket : clientSockets ) {
label.setText(socket.toString());
}
}
无论何时遍历列表,都需要执行相同的操作。
您还可以考虑使用
CopyOnArrayList
之类的东西,它不需要您进行同步,但要消耗更多的内存并可能提供稍微陈旧的数据。