我正在使用 Java ICMP ping 功能对网关进行 ping 操作。为了执行快速 ping,我使用 ExectorService 创建用于 ping 的线程。地址被 ping(或不)后,我想在 ping 后更新 Jprogressbar。我有这段代码正在运行,但它会在作业(ping 线程)完成之前更新 Jprogressbar。我想在工作完成后更新 jprogressbar。
private int NUM_THREADS = Runtime.getRuntime().availableProcessors();
ExecutorService exec = Executors.newFixedThreadPool(NUM_THREADS);
public void run() {
int JProgressBarValue = 0;
for (;GateWayKey<=GateWayKeyStop;GateWayKey++){
ip="192.168."+GateWayKey+".1";
exec.submit((new PingTask(ip,GateWayKey,true,scanFrameRefrence,ttl)));
JProgressBarValue=(GateWayKey/GateWayKeyStop)*100;
scanFrameRefrence.progressBar.setValue(JProgressBarValue);
scanFrameRefrence.progressBar.repaint();
}}
首先,不能从事件分派线程外部使用 Swing 组件。因此,更新进度条的代码必须包含在里面
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
scanFrameRefrence.progressBar.setValue(value);
}
});
现在,回答问题。如果您想在任务完成时更新进度条,更简单的方法是让任务本身在执行结束时更新进度条。
另一种方法是使用执行者完成服务 http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorCompletionService.html,当每个任务完成时可以收到通知(感谢阻塞队列)。
另外,请考虑发布实际的编译代码并遵守 Java 命名约定:变量以小写字母开头。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)