在Java中ping多个服务器

时间:2015-05-31 08:09:35

标签: java multithreading

我有一个程序向服务器发送ping请求。列表很大,如果IP无法访问,则需要一段时间才能转到下一个IP

我希望,对于每个IP,它应该创建一个新线程&同时处理所有这些。

以下是代码:

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

如何让这段代码在一个单独的线程中ping所有IP

2 个答案:

答案 0 :(得分:9)

如果没有其他人建议的ProcessBuilder那么做。

我有三个类 - PingParallel是我的主要类,PingTask是每个线程执行的任务,PingResult有结果代码(我们也可以添加更多信息,状态信息等)。

  

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

答案 1 :(得分:2)

ProcessBuilder会调用一个新进程,但是你通过调用waitFor来有效地杀死并行性,因为这将等待第一个进程在启动下一个进程之前完成,从而使调用成为顺序。 您可以使用PB并跳过等待调用,也可以使用普通的java线程来包含对Runtime.exec的调用。