2015-05-31 11 views
5

Mam program, który wysyła żądanie ping do serwerów. Lista jest duża i jeśli numer IP jest nieosiągalny, potrzeba czasu, aby przejść do następnej wersji IP.Ping wiele serwerów w Javie

Chciałbym, żeby każdy IP tworzył nowy wątek & przetwarzał je wszystkie jednocześnie.

Oto kod:

for (int i = 0; i < 89; i++) 
{ 
    ProcessBuilder processBuilder = new ProcessBuilder("ping", isWindows? "-n" : "-c", "1", buttons[i].getText()); 
    Process proc = processBuilder.start(); 
    returnVal = proc.waitFor();      
} 

Jak mogę uczynić ten kod do ping wszystkie IP S, każda w osobnym wątku?

+0

See [kod Java do ping adres IP] (http://stackoverflow.com/questions/11506321/java-code-to-ping-an-ip-address). – saka1029

+0

Wygląda jak idealna sytuacja, aby użyć klasy CompletableFuture dostarczanej z językiem Java 8. Sprawdź to! – pnadczuk

+0

Osoby, które zostały oznaczone jako duplikaty, nie prosiłem o ping i adres IP. Chcę sposobu na jednoczesne uruchamianie pingowania adresu IP. –

Odpowiedz

9

Co powiemy na to, że bez ProcessBuilder, jak sugerują również inni.

mam trzy klasy - PingParallel jest moje główne klasy, PingTask to zadanie wykonywane przez każdego wątku, a PingResult jest o kod wynikowy (możemy dodać trochę więcej informacji Także komunikat stanu itd).

PingParallel

package com.test.thread; 

import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 
import java.util.concurrent.Callable; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 

public class PingParallel { 

    public static void main(String[] args) { 
     int totalIps = 89; 
     ExecutorService executor = Executors.newFixedThreadPool(totalIps); 
     List<Future<PingResult>> list = new ArrayList<Future<PingResult>>(); 
     Callable<PingResult> callable = null; 
     for(int i=0; i< totalIps; i++){ 
      callable = new PingTask("127.0.0"+i); // Get the ipAddres buttons[i].getText()); 
      Future<PingResult> future = executor.submit(callable); 
      list.add(future); 
     } 
     for(Future<PingResult> fut : list){ 
      try { 
       System.out.println(new Date()+ "::"+fut.get()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     executor.shutdown(); 
    } 
} 

PingTask

package com.test.thread; 

import java.net.InetAddress; 
import java.util.concurrent.Callable; 

public class PingTask implements Callable<PingResult> { 

    private String ipAddress; 

    public PingTask(String ipAddress) { 
    this.ipAddress = ipAddress; 
    } 

    @Override 
    public PingResult call() { 
    InetAddress inet = null; 
    try { 
     inet = InetAddress.getByName(ipAddress); 
     int resultCode = inet.isReachable(5000) ? 0 : -1; 
     return new PingResult(ipAddress, resultCode); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return new PingResult(ipAddress, -1); 
    } 
    } 
} 

PingResult

package com.test.thread; 

public class PingResult { 

    private String ipAddress; 
    private int resultCode; 

    public PingResult(String ipAddress, int resultCode) { 
    this.ipAddress = ipAddress; 
    this.resultCode = resultCode; 
    } 

    public String getIpAddress() { 
    return ipAddress; 
    } 

    public int getResultCode() { 
    return resultCode; 
    } 

    public String toString() { 
    return "IpAddress :: "+ ipAddress + " Result Code : "+ resultCode; 
    } 
} 
2

ProcessBuilder wywołuje nowy proces, ale skutecznie zabijasz paralelizm, wywołując funkcję waitFor, ponieważ spowoduje to oczekiwanie na zakończenie pierwszego procesu przed uruchomieniem następnego, co spowoduje wykonanie kolejnych wywołań. Można albo użyć PB i pominąć wywołania oczekiwania, albo użyć zwykłych wątków java zawijających wywołania do Runtime.exec.

+0

Jeśli usunę linię 'returnVal = proc.waitFor();', to jak mogę sprawdzić, czy host jest osiągalny czy nie? –

+0

Zamiast wywoływania powolnego, blokowania 'proc.waitFor', natychmiast dodajesz' proc' do 'ArrayList'. Kiedy już wszystkie te 'proc's działają równolegle mają drugą pętlę, która przechodzi przez' ArrayList' i wywołuje 'proc.waitFor', z których większość szybko wróci, ponieważ wszystkie one działają równolegle. To powiedziawszy, zgadzam się z każdym, kto sugeruje, że nie używa Procesu w tym celu i zamiast tego używa natywnej Javy. – theon