2013-07-14 75 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命名約定:變量以小寫字母開頭。