Я хочу отправить пинг для 10 пользователей одновременно и обновить пользовательский объект с результатом, как только пинг завершен.
Для этого я пытаюсь использовать ExecutorService .
Я начал с такого кода:
private void pingUsers(List<User> userList) throws ExecutionException, InterruptedException {
final int NUM_THREADS = 10;
ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS);
for (User user : userList) {
SnmpPingDevice pingUser = new PingUser(user);
Future<Boolean> isUserActive = executor.submit(pingUser);
user.isActive = isUserActive.get() ; // -- I guess it will block other pings and i'm back to my starting point where I need to run the pings in parallel.
}
executor.shutdown();
try {
executor.awaitTermination(30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
logger.error("Failed to terminate executor");
}
}
Вот так выглядит мой класс PingUser:
@Override
public Boolean call() {
ping = new CmdRunner(toolDir,outDir,
new UserOidWorkerPing(version,community,ip,logger));
return this.isActive();
}
public boolean isActive(){
String cmd = ping.getCmdNoRedirect();
String rc = this.cmdRunner.runShellCmd(cmd,this.outDir +"/dummy",false);
logger.debug("PING was sent with cmd:" + cmd + ",rc:" + rc);
return rc != null && !rc.contains("Timeout:") && !rc.isEmpty();
}
И Вернемся к той же проблеме: пинги не будут выполняться параллельно (как только l oop ожидает окончания isUserActive.get()
)
Есть идеи, что мне не хватает? Как я могу заставить эти эхо-запросы выполняться параллельно и сохранить результат для каждого пользователя в моем List<User> userList
?