Java Try-With-Resources 未知资源计数

标签 java try-with-resources autocloseable

我需要打开 N 个多播套接字(其中 N 来自参数列表的大小)。然后,我将在循环内将相同的数据发送到 N 个套接字中的每一个,最后关闭每个套接字。我的问题是,如何使用 try-with-resources block 来做到这一点?以下是我如何使用单个资源执行此操作:

final int port = ...;
try (final MulticastSocket socket = new MulticastSocket(port)) {
    // Do a bunch of sends of small packet data over a long period of time
    ...
}

我能想到的使用多个端口执行此操作的唯一方法如下:

final List<Integer> ports = ...;
final List<MulticastSocket> sockets = new ArrayList<>(ports.size());
try {
    for (final Integer port : ports) {
        sockets.add(new MulticastSocket(port));
    }

    // Do a bunch of sends of small packet data over a long period of time
    ...
} finally {
    for (final MulticastSocket socket : sockets) {
        try {
            socket.close();
        } catch (final Throwable t) {
            // Eat the exception
        }
    }
}

是否有更简洁的方法来完成此任务,或者我提出的解决方案是否足够好?

最佳答案

递归地执行以保持 try-with-resources 的保证:

void foo(List<Integer> ports, List<Socket> sockets) {
  if (sockets.size() == ports.size()) {
    // Do something with your sockets.
  } else {
    try (Socket s = new MulticastSocket(ports.get(sockets.size())) {
      sockets.add(s);
      foo(ports, sockets);
      // You could call sockets.remove(sockets.size()-1) here.
      // Not convinced whether it's worth it.
    }
  }
}

关于Java Try-With-Resources 未知资源计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44575340/

相关文章:

java - 在 Java 中并行执行依赖任务

java - 强制尝试使用资源 Java 7

java - Java 程序终止时未能关闭文件有什么危害吗?

stream - 关闭流链和尝试资源

java - 在 Line 接口(interface)中,我必须为所有实例调用 close() ,还是仅在 Line 打开时调用 close() ?

java - 何时使用 JDO DataNucleus Query.close()

java - Spark2 Java 数据集 Sql

java - 如何设置 Eclipse 作业执行的顺序?

java - 如何通过 gradle 插件强制执行此模式?

kotlin - 我自己对 Kotlin 的 try-with-resources 缺席的解决方案