标准场景:用户按下按钮并开始大任务。 EventThread 创建 SwingWorker
来执行任务并继续生活。
现在,由于大任务是高度可并行化的,SwingWorker
线程做的第一件事就是创建一组工作线程并将工作分摊出去。
我的问题:是否允许工作线程调用 SwingWorker#publish()
来触发 GUI
更新,或者只是 SwingWorker
线程允许这样做吗?
谢谢, 卡斯滕
[编辑] 一些伪代码使我的用例更清晰一些。问题基本上是:下面的代码可以吗?如果我遗漏 waitForAllWorkerThreadsToFinish();
会怎么样?
public class MySwingWorker extends SwingWorker {
class MyWorkerThread extends Runnable {
void run() {
while(!exitCondition) {
doSomeWork();
publish(progressUpdate);
reEvaluateExitCondition();
}
}
}
public Void doInBackground() {
createAndStartBunchOfMyWorkerThreads();
waitForAllWorkerThreadsToFinish();
}
void process(List<V> chunks) {
updateGuiWithProgress(chunks);
}
}
最佳答案
一般来说,没有; publish()
旨在在后台线程上运行,该线程本身必须同步来自辅助工作人员的所有结果。幸运的是,您在设计后台线程如何执行此操作方面有相当大的自由度。例如,这个 example使用 CountDownLatch
.
附录:waitForAllWorkerThreadsToFinish()
看起来是 CountDownLatch
的一个很好的用例. MyWorkerThread
绝对应该 不 从 MySwingWorker
以外的线程调用 publish()
而不同步对任何共享数据的访问。 MyWorkerThread
可以使用 invokeLater()
更新 GUI ,但顺序将不可靠。
附录:你问了一个非常实际的问题,
Do you have any reference for your answer, that [other] worker threads are not allowed to use
publish()
?
Memory Consistency Properties是一个很好的总结。实际上,你会调用 publish()
来自没有同步的多个线程。结果将不可预测。
关于java - 允许哪些线程调用 SwingWorker#publish?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6516159/