我需要创建一个线程池来使用java语言同时ping一系列ip地址。
请帮帮我。
已编辑1
如果有很多线程被创建,那么我们是否必须显式调用stop()方法来停止线程?还是要小心?
答案 0 :(得分:2)
这是pingig子任务的implementation。使用引用的有效负载创建线程池和线程不应该太复杂。
修改强>
如果您可以修改这些设备上的客户端代码,我建议使用自定义协议,而不是使用echo端口 - 类似于心跳,您经常向客户端发送一条小消息(在标准或不同的端口上)和期望在规定的时间内得到答案。
修改2
对于线程基础知识,我真的建议查看Java教程。首先:实现类似public class PingThread extends Thread
的类,并将链接中的代码放在run方法的while(true) {...}
循环中。使用Thread.sleep()
在同一循环中的ping之间添加等待时间。
如果您确实需要ThreadGroup,请覆盖构造函数Thread(ThredGroup group, String name)
,以便可以在指定的组中创建PingThread。
您可能希望实现一个停止PingThread的开关(几乎每个Java教程都应该介绍),
答案 1 :(得分:0)
默认情况下,Java没有ICMP的实现,因此无法使用标准库从Java ping主机。您的其他选择是查找Java ICMP实现(我不知道是否存在),或者从Java调用系统上的'ping'可执行文件并解析输出。
编辑:Andreas_D的链接表明InetAddress.isReachable()使用ICMP echo请求来ping主机,这就是你如何实现ping。
您可以从该页面获取ReachableTest的代码,并将ReachableTest类更改为Runnable,然后可以在其自己的线程中运行,或者使用java.util.concurrent中的executor服务:
public class ReachableTest implements Runnable {
private String host;
public ReachableTest(String host) {
this.host = host;
}
public void run() {
try {
InetAddress address = InetAddress.getByName(host);
System.out.println("Name: " + address.getHostName());
System.out.println("Addr: " + address.getHostAddress());
System.out.println("Reach: " + address.isReachable(3000));
}
catch (UnknownHostException e) {
System.err.println("Unable to lookup " + host);
}
catch (IOException e) {
System.err.println("Unable to reach " + host);
}
}
}