我有一个程序向服务器发送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
?
答案 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的调用。