【问题标题】:How to close a cline socket from another thread in a concurrent java socket app如何在并发 Java 套接字应用程序中从另一个线程关闭 cline 套接字
【发布时间】:2021-05-28 16:28:09
【问题描述】:
我正在做一个套接字应用程序,我想做一个管理员客户端和普通客户端。管理员客户端应该能够关闭其他客户端的连接。我做了以下但我得到并发修改异常,有时是套接字异常
private void closeClientConectionHandler(String nickname) throws IOException {
Iterator<clientHandler> list= clientList.iterator();
while (list.hasNext()) {
clientHandler client= list.next();
if (client.getNickname().equals(nickname)) {
client.clientSocket.close();
}
}
}
【问题讨论】:
标签:
java
multithreading
sockets
【解决方案1】:
您收到此错误是因为另一个线程中的某些内容正在修改列表。一旦您获得了Iterator<clientHandler> list= clientList.iterator(); 行的代码,一旦列表被另一个线程修改(添加或删除的项目),该迭代器就会变得无效。
可能的解决方案是:
- 使用
CopyOnWriteArrayList。此列表是线程安全的。
- 通过以下方式创建您的客户列表:
List<clientHandler> clientList= Collections.synchronizedList(new ArrayList<>());
然后将用于遍历列表的代码包装起来:
synchronized(clientList) {
Iterator<clientHandler> list= clientList.iterator();
while (list.hasNext()) {
...
}
}
这将防止其他线程在您迭代列表时修改列表。