我正在写一个IP扫描仪应用程序和过程是需要长时间因此,我在使用GUI 的回现场服务执行,如:如何从Swing worker运行服务执行程序?
public static List<Future<String>> checkThisIP(String ipStart, String ipEnd) throws UnknownHostException {
final ExecutorService es = Executors.newFixedThreadPool(10);
final List<Future<String>> futures = new ArrayList<>();
String ipStringStart;
String ipStringEnd;
String targetIpString;
//my update
ipStringStart = ipStart.substring(ipStart.lastIndexOf(".") + 1, ipStart.length());
ipStringEnd = ipEnd.substring(ipEnd.lastIndexOf(".") + 1, ipEnd.length());
targetIpString = ipStart.substring(0, ipStart.lastIndexOf(".") + 1);
if (!ipStart.equals(ipEnd)) {
for (int i = Integer.parseInt(ipStringStart); i <= Integer.parseInt(ipStringEnd); i++) {
String currentIp = targetIpString + i;
futures.add(runPingScan(es, currentIp));
}
} else {
futures.add(runPingScan(es, ipStart));
}
es.shutdown();
return futures;
}
public static Future<String> runPingScan(final ExecutorService es, final String ip) {
return es.submit(new Callable<String>() {
@Override
public String call() {
String returnMe = "";
//custom ping class
Ping p = new Ping();
//send message
p.SendReply(ip);
//IsReachable returns ture or false
if(p.IsReachable()){
returnMe=ip;
}
return returnMe;
}
});
}
这是使用的JButton原laggy代码预制行动:
// scan result is Future list returned from service executor
List<Future<String>> scanResult = p.checkThisIP(jFormattedTextField1.getText(), jFormattedTextField2.getText());
for (final Future<String> f : scanResult) {
try {
ip = f.get();
if (!ip.equals("")) {
arp ARP = new arp();
PortScan openPort = new PortScan();
IP ipClass = new IP();
mac = ARP.getMac(ip);
manufacturer = ARP.getOUI(mac);
ports = openPort.checkIpForPorts(ip);
hostname = ipClass.hostname(ip);
title = ipClass.htmlTitle(ip);
Object[] data = {ip, mac, manufacturer, ports, hostname, title};
tableModel.addRow(data);
}
if (jFormattedTextField1.getText().equals(jFormattedTextField2.getText()) && ip.equals("")) {
JOptionPane.showMessageDialog(null, "<html>Can not ping the address ! <br> Server might be protected by <b>WAF</b>.</html>", "Alert", HEIGHT);
}
} catch (Exception ex) {
Logger.getLogger(gui.class.getName()).log(Level.SEVERE, null, ex);
}
}
运行这段代码是好的,但是当我将其连接到开始扫描按钮的GUI滞后,我一派,想通了使用摇摆工人。当我单独实现了swing工作者的时候,它并没有实现并发性,而且当我实现了gui仍然滞后时。无论如何,我的问题是让按钮(Swing worker)调用服务执行程序来执行其他进程吗?
感谢您的解释+1。请注意,Swingworker的第一个参数应该是List>,我试过了你的答案,但我面临同样的滞后。看看我的回答,我只使用了swingworker函数** doInBackground()**来调用使用** service executor **(Lag cause)的函数,而没有其他的swingfunction函数。 –
第一个类型参数定义由'doInBackground'创建的数据,稍后通过调用'get'获取数据。它只是一个字符串列表,不需要未来,因为所有的ping检查都已经完成。如果你在'doInBackground'内部做了所有的事情,确保你的模型正确地处理了gui更新(即'invokeLater'),因为Swing不是线程安全的,任何接触它的组件都应该从EDT开始。 – duckstep
据我所知,字符串列表不能取List>。 'List > scanResult = p.checkThisIP(ip1,ip2); //该函数返回Future列表''所以如果我们想从'doInbackground()'返回该列表,那么第一个参数应该是'>'。 P.S:我试过自己试过了。谢谢 ! –