我有一个工作线程,应该等待EDT更新GUI,然后再继续执行。我已经使用发布方法告诉EDT改变了一些东西。我怎样才能让工人等待改变呢?
答案 0 :(得分: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);
}
}
答案 1 :(得分:4)
如果它也是启动GUI更改的同一个工作线程,那么就有一个现成的机制来等待这些更改:
SwingUtilities.invokeAndWait()
应该很好地适应这个法案。
另一种选择是使用SwingUtilities.invokeLater()为EDT提供一些代码来运行,这将在EDT变为空闲时唤醒你的线程,即当它开始运行这个任务时。这将涉及在invokeLater()
之后立即触发wait()
,并希望在执行wait()
之前不会发生EDI唤醒。然而,就时间而言,这并非万无一失。