【问题标题】: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&lt;clientHandler&gt; list= clientList.iterator(); 行的代码,一旦列表被另一个线程修改(添加或删除的项目),该迭代器就会变得无效。

    可能的解决方案是:

    1. 使用CopyOnWriteArrayList。此列表是线程安全的。
    2. 通过以下方式创建您的客户列表:
        List<clientHandler> clientList= Collections.synchronizedList(new ArrayList<>());
    

    然后将用于遍历列表的代码包装起来:

    synchronized(clientList) {
        Iterator<clientHandler> list= clientList.iterator();
        while (list.hasNext()) {
            ...
        }
    }
    

    这将防止其他线程在您迭代列表时修改列表。

    【讨论】:

      猜你喜欢
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多