new Thread(new Runnable() {
    @Override
    public void run() {
        List<Socket> socketList = new ArrayList<>();
        for (String ip: iplist) {
            Socket socket = null;
            try {
                socket = new Socket(ip,23);
            } catch (IOException e) {
                e.printStackTrace();
            }
            socketList.add(socket);
        }
    }
}).start();

我正在尝试为iplist中的每个IP创建一个新的套接字,并将该套接字添加到sockets列表中。我为此使用一个for循环。当使用try ... catch时,套接字连接失败时,循环执行将暂停很长一段时间。因此,我需要一个更好的替代方法来知道套接字连接失败,并通过向套接字列表添加空套接字来使循环继续执行。

最佳答案

您可以这样做:

  • 使用单独的线程创建每个套接字。
  • 使用并发集合(而不是List)来存储套接字,例如 ConcurrentLinkedDeque
  • 等待所有套接字创建者线程完成,然后根据需要将并发列表的所有元素添加到常规List中。您可以使用 CompletionService 来实现。

  • 使用这种方法,失败的套接字仍会花费很长时间,但不会阻止其他套接字的创建。如果每个套接字可以运行一个线程,则用于创建所有套接字的最大时间将接近单个故障的时间。

    通过等到所有套接字都被创建,该实现就不会在逻辑上偏离您当前的解决方案,它将变得更快,并且复杂性将变得自成体系。

    另一种选择是不要等到所有套接字创建完毕,然后让所有套接字创建在其线程中完成。这将与当前的实现大相径庭,并且处理套接字创建线程的复杂性会影响方法之外的代码。

    09-10 06:53
    查看更多