2013-07-14 43 views
0

我使用Java ICMP ping功能ping网关。为了执行快速ping操作,我使用ExectorService创建用于ping的线程。在ping地址之后(或不是),我想在ping之后更新Jprogressbar。我有这个代码正在工作,但它在作业(ping线程)完成之前更新Jprogressbar。我想在作业完成后更新jprogressbar。从ExecutorService更新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(); 
    }} 

回答

2

首先,Swing组件可能不在事件派发线程之外使用。因此,更新进度条的代码必须包含在内

SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     scanFrameRefrence.progressBar.setValue(value); 
    } 
}); 

现在,回答这个问题。如果要在任务完成时更新进度栏,则更简单的方法是让任务本身在执行结束时更新进度栏。

另一种方法是使用ExecutorCompletionService,可以在每个任务完成时通知(由于阻塞队列)。

此外,请考虑发布实际的,编译代码并遵守Java命名约定:变量以小写字母开头。