直接上代码
package com.demo.www.thread;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MyThreadPool {
//socket系统本来默认20s太久了这里改成1000
public static int SOCKET_TIMEOUT=1000;
//创建固定大小的线程池
public static ExecutorService executorService = Executors.newFixedThreadPool(4);
// //创建只有一个线程的线程池
// ExecutorService executorService1 = Executors.newSingleThreadExecutor();
// //创建无限执行线程池
// ExecutorService executorService2 = Executors.newCachedThreadPool();
public static void main(String[] args) {
String serverIp="192.168.11.155";
String ports="80,21,22,3306,3307,6379,6378,7077,8848,9000,9004,8080";
long stime=System.currentTimeMillis();
Map<String,Long>portMaps=MyThreadPool.sumbitTask(serverIp,ports);
long etime=System.currentTimeMillis();
String [] portsArr=ports.split(",");
for (String item :portsArr){
long speed=portMaps.get(item);
System.out.println("IP:"+serverIp+" port:"+item+" is "+(speed==-1?"closed":"open"+" speeds:"+speed+"ms"));
}
System.out.println("执行完成:"+portMaps.size()+" 耗时:"+(etime-stime)+"ms");
}
public static Map<String,Long> sumbitTask(String ip,String ports){
String [] portsArr=ports.split(",");
Map<String,Long> maps=new HashMap<>();
for (String item :portsArr){
int port= Integer.parseInt(item);
long speed=-1;
try {
speed= executorService.submit(()-> MyThreadPool.isOpen(ip,port,MyThreadPool.SOCKET_TIMEOUT)).get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
maps.put(item,speed);
}
return maps;
}
/***
* 返回延时 返回-1表示关闭
* @param serverIp
* @param serverPort
* @param timeout ms
* @return
*/
public static long isOpen(String serverIp,int serverPort,int timeout){
long speed=-1;
Socket client;
try {
long stime=System.currentTimeMillis();
// client = new Socket(serverIp, serverPort);
client = new Socket();
client.connect(new InetSocketAddress(serverIp, serverPort), timeout); //默认的就是20s太久
long etime=System.currentTimeMillis();
speed=etime-stime;
client.close();
} catch (IOException e) {
// e.printStackTrace();
speed=-1;
}
System.out.println("current:"+serverPort+" port:"+serverPort+" speeds:"+speed+"ms");
return speed;
}
}