2013-07-14 1 views
0

Я pinging шлюзы, используя функцию IC ICMP ping. Для выполнения быстрого пинга я использую ExectorService, который создает потоки для ping. После того, как адрес pinged (или нет), я хочу обновить Jprogressbar после ping. У меня есть этот код, который работает, но он обновляет Jprogressbar перед заданием (ping thread). Я хочу обновить jprogressbar после завершения работы.Обновление JProgressBar от ExecutorService

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: переменные начинаются с строчной буквы.