import java.io.*;
import java.net.*;
import java.util.concurrent.*;
public class NewTest{
class a implements  Runnable{
private InetAddress address;
public a(InetAddress address){
this.address=address;
}
public void run(){
try {
if(address.isReachable(5000)){
System.out.println(address);
}
            
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
public  NewTest(){
}
public  void start(){
ExecutorService pool=Executors.newFixedThreadPool(10);
for(int i=50;i<100;i++){
InetAddress address=null;
try {
 address= InetAddress.getByName("192.168.6."+i);
}
catch (Exception ex) {
ex.printStackTrace();
}
        pool.execute(new a(address));//    .start();
}
}
public static void main(String[] args){
NewTest nt=new NewTest();
nt.start();
}
}
为什么这段代码当ping 50到60的时候可以ping出好多个主机,而如果在for循环中ping 2-254却只能ping出3个显然和实际数量不符,我一开始以为是同时ping过多的原因于是增加了线程池最多允许10线程同时工作,但是效果还是不理想,这问题的根源究竟是什么呢

解决方案 »

  1.   

    我这里没问题  ping的时候会有问题吗  
      

  2.   

    只要你是用InetAddress.getByName(String ip),其中:ip是点分IP形式如:"234.455.345.455",则: 
    1)根本不会到网上去找 
    2)直接在程序中进行合法性判断(即:用split("\\.")分解后再判每一个部分是不是 <=255) 
    3)172.16.67.233这个地址是合法的 ,是不需要再到网上去确定这个ip的.
    如果池中当前有多于 corePoolSize 的线程,则这些多出的线程在空闲时间超过 keepAliveTime 时将会终止(api ThreadPoolExecutor原话)按我的理解就是2-254中,当前10个线程执行时,剩下的线程超过了空闲时间,所以被取消了,所以才会这样;