如何在一定时间后继续 for 循环而不使用 `try ... catch` 方法?
How to continue a for loop after a certain time without using `try ... catch` method?
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
. 来实现它
使用这种方法,失败的套接字仍然需要很长时间,但不会阻止其他套接字的创建。如果你可以 运行 每个套接字一个线程,那么用于创建所有套接字的最长时间将是关闭单个失败的时间。
等到所有套接字都创建完毕后,该实现就不会与您当前的解决方案发生逻辑上的偏离,它只会更快,而且复杂性将是独立的。
另一种选择是不等到所有套接字都创建完毕,让所有套接字创建在各自的线程中完成。这将与当前的实现有很大的不同,并且处理套接字创建线程的复杂性会影响您的方法之外的代码。
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
. 来实现它
使用这种方法,失败的套接字仍然需要很长时间,但不会阻止其他套接字的创建。如果你可以 运行 每个套接字一个线程,那么用于创建所有套接字的最长时间将是关闭单个失败的时间。
等到所有套接字都创建完毕后,该实现就不会与您当前的解决方案发生逻辑上的偏离,它只会更快,而且复杂性将是独立的。
另一种选择是不等到所有套接字都创建完毕,让所有套接字创建在各自的线程中完成。这将与当前的实现有很大的不同,并且处理套接字创建线程的复杂性会影响您的方法之外的代码。