java - 如何在一定时间后继续 for 循环而不使用 `try ... catch` 方法?

标签 java android sockets for-loop java-threads

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 来实现它.

使用这种方法,失败的套接字仍然需要很长时间,但不会阻止其他套接字的创建。如果您可以为每个套接字运行一个线程,则创建所有套接字所用的最长时间将是关闭一次失败的时间。

等到所有套接字都创建完毕后,实现就不会与您当前的解决方案发生逻辑上的偏离,它只会更快,而且复杂性将是独立的。

另一种选择是不等到所有套接字都创建完毕,让所有套接字创建在它们的线程中完成。这将与当前的实现有很大的不同,并且处理套接字创建线程的复杂性会影响您的方法之外的代码。

关于java - 如何在一定时间后继续 for 循环而不使用 `try ... catch` 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41295730/

相关文章:

java - MVC 与 Netbeans 表单生成器

Java : ignore single click on double click?

android - 放大授权: Unable to add User to the Pool

空对象引用上的 java.lang.NullPointerException : Attempt to invoke virtual method . .. FirebaseAuth.getCurrentUser()'

c - setsockopt() SOL_IP API 级别和 IPT_SO_SET_REPLACE 开关

c - Linux: fork 两次和守护进程(ise)之间的区别

JavaFX:使用自定义样式表将文本颜色应用于 TableCell?

java - 让 javadoc 与 netbeans 一起工作

android - 退出应用程序时关闭蓝牙

java - 套接字在将 json 对象从 Java 传输到 Python 时被阻塞