5

我有一个工作线程应该等待 EDT 在继续执行之前更新 GUI。我已经使用发布方法告诉 EDT 进行更改。我怎样才能让工人等待改变发生?

4

2 回答 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 回答