2015-05-31 16 views
5

Sunuculara bir ping isteği gönderen bir programım var. Liste büyüktür ve bir IP ulaşılamıyorsa, bir sonraki IP adresine gitmek zaman alır.Java'da birden fazla sunucuya ping atma

İsterseniz, her IP için, hepsi aynı anda & yeni bir iş parçacığı oluşturmalıdır. İşte

kodudur:

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

Nasıl bu kod ayrı bir konu tüm IP s, her ping yapabilir?

+0

bakınız [bir IP adresi ping için Java kodu] (http://stackoverflow.com/questions/11506321/java-code-to-ping-an-ip-address). – saka1029

+0

Java 8 ile birlikte gelen CompletableFuture sınıfını kullanmak için mükemmel bir duruma benziyor. – pnadczuk

+0

Yinelenen olarak işaretlenenler, ping ve IP adresi istemedim. Ben IP adresi ping simultane ile başlamak için bir yol istiyorum. –

cevap

9

Diğerleri tarafından da önerildiği gibi ProcessBuilder olmadan yapmamaya ne dersiniz.

Üç sınıfları - PingParallelPingTask her iş parçacığı tarafından gerçekleştirilen bir görevdir, benim ana sınıftır ve PingResult (biz vb de biraz daha bilgi, durum mesajı ekleyebilirsiniz) sonuç kodunu sahip olduğunu.

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 yeni bir işlem başlatıyor, ancak waitFor'u çağırarak paralelliği etkin bir şekilde öldürüyorsunuz, çünkü bu işlem bir sonraki başlatılmadan önce ilk işlemin tamamlanmasını bekler, bunun yerine çağrıları sıralı hale getirir. PB'yi kullanabilir ve bekleme çağrılarını atlayabilir veya çağrıları Runtime.exec yerine sarmalayan sıradan java ipuçlarını kullanabilirsiniz.

+0

"returnVal = proc.waitFor();' satırını kaldırırsam, ana makinenin ulaşılabilir olup olmadığını nasıl anlarım? –

+0

Yavaş çağırmaktan çok, 'proc.waitFor' komutunu engellemek yerine hemen' ArrayList 'öğesine' proc 'ekleyin. Tüm bu 'proc'ların paralel olarak çalışmasını sağladıktan sonra, 'ArrayList' boyunca ilerleyen ve' proc.waitFor' olarak adlandırılan ikinci bir döngü vardır. Bununla birlikte, bunun için Proses kullanmamayı ve bunun yerine yerel Java kullanmayı öneren herkese katılıyorum. – theon

İlgili konular