рабочий поток колебания Java для ожидания EDT

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

5
задан Mihaela 3 July 2010 в 22:06
поделиться

2 ответа

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

SwingUtilities.invokeAndWait()

должен подойти.

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

4
ответ дан 14 December 2019 в 01:01
поделиться

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

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);
    }
}
5
ответ дан 14 December 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: