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
时,当套接字连接失败时,循环执行会暂停一段时间。所以我需要一个更好的替代方案来知道套接字连接失败,并通过在套接字列表中添加一个空套接字来使循环继续执行。
答案 0 :(得分:4)
你可以这样做:
List
)来存储套接字,例如ConcurrentLinkedDeque
。List
。您可以使用例如CompletionService
。使用这种方法,失败的套接字仍然需要很长时间,但不会阻止其他套接字的创建。如果你可以为每个套接字运行一个线程,那么用于创建所有套接字的最大时间将接近单个故障的时间。
通过等待所有套接字的创建,实现不会与您当前的解决方案完全不同,它会更快,并且复杂性将是自包含的。
另一种方法是不要等到创建所有套接字,并让所有套接字创建在其线程中完成。这将与当前实现有很大不同,处理套接字创建线程的复杂性会影响方法之外的代码。