java swing工作线程等待EDT

Mih*_*ela 5 java swingworker

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

mdm*_*dma 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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Car*_*icz 4

如果也是您的同一个工作线程正在启​​动 GUI 更改,那么有一个现成的机制用于等待进行这些更改:

SwingUtilities.invokeAndWait()

应该很符合要求。

另一种替代方法是使用SwingUtilities.invokeLater()为 EDT 提供一些要运行的代码,一旦 EDT 空闲(即当它开始运行此任务时),该代码将唤醒您的线程。这将涉及立即触发invokeLater()await()并希望在执行 之前不会发生 EDI 唤醒wait()。不过,就时间安排而言,这并不是万无一失的。