我有一个工作线程应该等待 EDT 在继续执行之前更新 GUI。我已经使用发布方法告诉 EDT 进行更改。我怎样才能让工人等待改变发生?
问问题
2291 次
2 回答
5
我假设您正在使用 SwingWorker 发布您的结果。您可以使用布尔标志来指示该值已被处理。该标志在发布中间结果之前被清除,然后用于阻塞线程直到它被设置。UI 线程在完成处理已发布数据时设置标志。
class MyWorker extends SwingWorker<K,V>
{
boolean processed = true;
protected void doInBackground() {
for (;;) {
setProcessed(false);
publish(results);
waitProcessed(true);
}
}
synchronized void waitProcessed(boolean b) {
while (processed!=b) {
wait();
}
// catch interrupted exception etc.
}
synchronized void setProcessed(boolean b) {
processed = b;
notifyAll();
}
protected void process(List<V> results) {
doStuff();
setProcessed(true);
}
}
于 2010-07-03T22:29:22.413 回答
4
如果它也是您启动 GUI 更改的同一个工作线程,那么有一个现成的机制来等待这些更改发生:
SwingUtilities.invokeAndWait()
应该很合适。
另一种选择是使用SwingUtilities.invokeLater()给 EDT 一些代码以运行,一旦 EDT 空闲,即当它开始运行此任务时,它将唤醒您的线程。这将涉及立即触发,invokeLater()
然后是 await()
并希望在您执行wait()
. 不过,这在时间方面并不是万无一失的。
于 2010-07-03T22:22:44.097 回答