рабочий поток Java Swing ждать EDT - PullRequest
5 голосов
/ 04 июля 2010

У меня есть рабочий поток, который должен ждать, пока EDT обновит графический интерфейс, прежде чем продолжить выполнение.Я использовал метод публикации, чтобы сказать EDT что-то изменить.Как я могу заставить работника ждать, пока это изменение произойдет?

Ответы [ 2 ]

5 голосов
/ 04 июля 2010

Я предполагаю, что вы используете SwingWorker для публикации своих результатов. Вы можете использовать логический флаг, чтобы указать, что значение было обработано. Этот флаг очищается перед публикацией промежуточных результатов, а затем используется для блокировки потока, пока он не будет установлен. Поток пользовательского интерфейса устанавливает флаг, когда он завершает обработку опубликованных данных.

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);
    }
}
4 голосов
/ 04 июля 2010

Если также ваш рабочий поток инициирует изменения графического интерфейса, то есть готовый механизм ожидания внесения этих изменений:

SwingUtilities.invokeAndWait ()

должно отвечать всем требованиям.

Другой альтернативой будет использование SwingUtilities.invokeLater () , чтобы дать EDT некоторый код для запуска, который разбудит ваш поток, как только EDT станет бездействующим, то есть когда он приступит к выполнению этой задачи. Это включает в себя запуск invokeLater(), за которым сразу следует wait(), и в надежде, что пробуждение от EDI не произойдет до того, как вы выполните wait(). Хотя это не совсем надежно в отношении времени.

...