我有一个工作线程,应该等待EDT更新GUI,然后再继续执行.我已经使用发布方法告诉EDT改变了一些东西.我如何让工人等待改变?
我假设您使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果也是您的同一个工作线程正在启动 GUI 更改,那么有一个现成的机制用于等待进行这些更改:
SwingUtilities.invokeAndWait()
应该很符合要求。
另一种替代方法是使用SwingUtilities.invokeLater()为 EDT 提供一些要运行的代码,一旦 EDT 空闲(即当它开始运行此任务时),该代码将唤醒您的线程。这将涉及立即触发invokeLater()await()并希望在执行 之前不会发生 EDI 唤醒wait()。不过,就时间安排而言,这并不是万无一失的。
| 归档时间: |
|
| 查看次数: |
2043 次 |
| 最近记录: |