0

我正在使用 Java ICMP ping 功能 ping 网关。为了执行快速 ping,我使用了 ExecectorService,它创建了用于 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();
    }}
4

1 回答 1

2

首先,Swing 组件不能在事件分派线程之外使用。所以,更新进度条的代码必须包含在里面

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

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

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

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

于 2013-07-14T14:32:55.440 回答