gpt4 book ai didi

java - ExecutorService InvokeAll 进度条

转载 作者:行者123 更新时间:2023-11-29 09:02:24 24 4
gpt4 key购买 nike

我有一个 ExectorService 和以下代码,在 futures 和并发性方面一切正常。然而,当我尝试从 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();
}

}

编辑:编辑添加一些额外的代码以帮助理解

最佳答案

您正在从事件分派(dispatch)线程以外的线程访问 Swing 组件。 Swing threading policy 禁止这样做.

使用此代码从后台线程更新进度条:

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
someClassUI.jProgressBar.setValue(50);
}
});

official swing tutorial 中阅读更多关于 Swing 并发的信息.

关于java - ExecutorService InvokeAll 进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16598000/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com