У меня есть приложение, написанное в java, которое должно найти все доступные хосты в сети.Происходит забавная вещь ... ExecutorCompletionService
Я использую InetAddress.isReachable()
, чтобы сделать это с тайм-аутом в 2000 миллисекунд.
Я просматриваю IP-адрес текущего локального компьютера и на основании этого пытаюсь достичь других IP-адресов, заканчивающихся 1 - 255, пропускающих IP-адрес локальных компьютеров.
Все работает отлично однопоточно, просто занимает много времени, так как большинство IP-адресов недоступны, так как они не существуют, поэтому используйте 2-секундный тайм-аут.
Чтобы ускорить процесс (и опробовать параллелизм в действии :: Brian Goetz) я попытался с помощью Future
и Callable
т.д.
Это все шло хорошо, как хорошо.
Однако я воображал, используя ExecutorCompletionService
, чтобы дать своим пользователям более отзывчивое приложение, чтобы они могли видеть результаты, как они пришли доступны с помощью
Future<Reach> reachedFuture = completionService.take();
Запуска этого на singleprocessor машине со следующей конфигурацией вызывает только один из четыре достижимых хосты должны быть определены:
private static final int poolSize = 10;
private static final int maxPoolSize = 10;
private static final long keepAliveTime = 120;
private static final LinkedBlockingQueue<Runnable> queue
= new LinkedBlockingQueue<Runnable>(20);
private static final ExecutorService executorService
= new ThreadPoolExecutor(poolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS, queue);
private static final CompletionService<Reach> completionService
= new ExecutorCompletionService<Reach>(executorService);
Изменение его к этому на четырехъядерной машине также он не в состоянии обнаружить все достижимые узлы:
private static final int poolSize
= Math.max(2,Runtime.getRuntime().availableProcessors());
private static final int maxPoolSize
= Math.max(2,Runtime.getRuntime().availableProcessors());
Изменив InetAddress.isReachable()
таймаут на 10 секунд, последняя работа с конфигурацией выполнена нормально.
также путем изменения конфигурации следующим образом на четырехъядерной машине также она работает с 2 вторым таймом-аутом:
private static final int poolSize = 2;
private static final int maxPoolSize = 2;
Я пропускаю что-то очень понятно, почему это происходит?
Что останавливает InetAddress.isReachable(2000)
от обнаружения всех доступных хостов в моей сети?
Почему попытка выполнить несколько вызовов InetAddress.isReachable()
не выполняется?
Вы пытались использовать 'Executors.newSingleThreadExecutor()', чтобы увидеть, является ли это кодом потока, вызывающим проблему? Это по крайней мере направит нас в правильном направлении. –