Har*_*ava 5 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();
}
Run Code Online (Sandbox Code Playgroud)
如何让这个代码IP在一个单独的线程中ping所有s?
如果没有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();
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3012 次 |
| 最近记录: |