java swing工作线程等待EDT

时间:2010-07-03 22:06:45

标签: java swingworker

我有一个工作线程,应该等待EDT更新GUI,然后再继续执行。我已经使用发布方法告诉EDT改变了一些东西。我怎样才能让工人等待改变呢?

2 个答案:

答案 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唤醒。然而,就时间而言,这并非万无一失。

相关问题