Frage

Ich habe eine Anwendung in Java geschrieben, dass alle Bedürfnisse der erreichbaren Hosts im Netzwerk zu finden.

Ich verwende InetAddress.isReachable() dieses von 2000 Millisekunden mit einem Timeout zu tun.

ich die aktuellen lokalen Rechner des IP-Adresse nachschlagen und basierend auf, dass ich versuchen, die anderen IP-Adressen zu erreichen, dass Ende. 1 - 255 die lokalen Maschinen IP-Adresse verpassten

Es funktioniert alles in Ordnung Single-Threaded, dauert nur eine lange Zeit, da die meisten der IP-Adressen nicht erreichbar sind, da sie so die 2-Sekunden-Zeit aufbrauchen nicht vorhanden ist.

Um die Dinge beschleunigen (und ausprobieren Gleichzeitigkeit in Aktion :: Brian Goetz) Ich habe versucht, mit Future und Callable etc.

Das alles ging gut auch.

Doch ich glaubte ExecutorCompletionService mit meinem Benutzer eine reaktions Anwendung zu geben, so dass sie Ergebnisse sehen konnte, wie sie gekommen sind verfügbar mit

Future<Reach> reachedFuture = completionService.take();

Ausführen dieses auf einer singleprocessor Maschine mit der folgenden Konfiguration verursacht nur 1 der vier erreichbaren Hosts identifiziert werden:

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);

Ändern sie diese auf einem Quad-Core-Maschine machte es auch nicht alle der erreichbaren Hosts erkennen:

private static final int poolSize
        = Math.max(2,Runtime.getRuntime().availableProcessors());

private static final int maxPoolSize
        = Math.max(2,Runtime.getRuntime().availableProcessors());

Durch die InetAddress.isReachable() Timeout auf 10 Sekunden zu ändern machte die letzte Konfigurations Arbeit ok.

Auch durch die Config ändern, wie auf der Maschine Quad-Core folgt zusammen auch arbeiten, um es mit einem 2 Sekunden-Timeout:

private static final int poolSize = 2;
private static final int maxPoolSize = 2;

Bin ich etwas fehlt ganz klar, warum dies geschieht?

Was hält InetAddress.isReachable(2000) von allen erreichbaren Hosts in meinem Netzwerk festgestellt?

Warum versuchen mehrere InetAddress.isReachable() Anrufe nicht ausgeführt?

War es hilfreich?

Lösung

So schrieb ich ein kleines Testskript auf meinem Mac, und ich kann es nicht scheitern bekommen - unabhängig von der Größe des Pools. Ich habe die LinkedBlockingQueue unbegrenzt sein ändern sonst könnte ich nicht alle Jobs einreichen. Auch nach einer Weile der isReachable() Methode eine ConnectException wirft so hatte ich, dass speziell zu behandeln. Ist dies das Problem mit Ihrem Code @ user423199?

Hier ist der Code:

http://pastie.org/2460991

Ich frage mich, was OS Sie diese laufen auf? Bestimmter IP-Stapel kann nicht wie mehrere Threads zu tun ICMP-Pakete innerhalb des gleichen Prozesses. Ich hätte gedacht, dass alle modernen Betriebssysteme über die intelligenten sein würden, aber dies kann ein potenzielles Problem sein. Es kann auch einige Fehler zwischen der Java JRE und dem OS-Stack sein.

Hope, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top