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线程同时工作,但是效果还是不理想,这问题的根源究竟是什么呢
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)根本不会到网上去找
2)直接在程序中进行合法性判断(即:用split("\\.")分解后再判每一个部分是不是 <=255)
3)172.16.67.233这个地址是合法的 ,是不需要再到网上去确定这个ip的.
如果池中当前有多于 corePoolSize 的线程,则这些多出的线程在空闲时间超过 keepAliveTime 时将会终止(api ThreadPoolExecutor原话)按我的理解就是2-254中,当前10个线程执行时,剩下的线程超过了空闲时间,所以被取消了,所以才会这样;