我正在使用Java ICMP ping功能对网关进行ping。为了执行快速ping,我使用ExectorService,它为ping创建线程。在地址被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);
}
});
现在,回答问题。如果要在任务完成时更新进度条,更简单的方法是让任务本身在执行结束时更新进度栏。
另一种方法是使用ExecutorCompletionService,当每个任务完成时,都可以通知它(由于阻塞队列)。
此外,考虑发布实际的、编译的代码,并遵守Java命名约定:变量以小写字母开头。