我有一个 ExectorService 和以下代码,期货和并发性一切正常。但是,当我尝试从 SomeClass() 更新我的进度条时,它似乎只在 invokeAll() 完成后更新 UI……基本上,进度条只有在一切都完成后才会更新,这认为它没用。
我该如何解决这个问题?我查看了 CompletionServices 和 SwingWorkers,但我不知道如何将它们应用到我的代码中。任何帮助将不胜感激。
class SomeClass() {
private static class Result {
private final String someVar;
public Result(String code) {
this.someVar = code;
}
}
public static Result compute(Object obj) {
// ... compute stuff
someVar = "computedResult";
return Result(someVar);
}
public someFunction() {
List<Callable<Result>> tasks = new ArrayList<Callable<Result>>();
for (Object f : listOfObjects) {
Callable<Result> c = new Callable<Result>() {
@Override
public Result call() throws Exception {
someClassUI.jProgressBar.setValue(50);
return compute(file);
}
};
tasks.add(c);
}
List<Callable<Result>> tasks = new ArrayList<Callable<Result>>();
List<Future<Result>> results = executorService.invokeAll(tasks);
for (Future<Result> fr : results) {
String value = fr.get().resultValue;
}
}
}
class SomeClassUI {
public static jProgressBar;
public someClassUI() {
jProgressBar = new JProgressBar(0,100);
}
private void button1ActionPerformed(ActionEvent e) {
SomeClass theClass = new SomeClass();
theClass.someFunction();
}
}
编辑:编辑添加一些额外的代码以帮助理解