作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有主线程和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
这样的东西,它不需要您同步,但代价是使用更多内存并可能提供稍微陈旧的数据。
关于java - 从另一个线程向 ArrayList 添加内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12339592/
我是一名优秀的程序员,十分优秀!