从ExecutorService更新JProgressBar

时间:2013-07-14 14:25:32

标签: java swing executorservice jprogressbar

我正在使用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();
    }}

1 个答案:

答案 0 :(得分:2)

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

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

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

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

另外,考虑发布实际的,编译代码和尊重Java命名约定:变量以小写字母开头。