У меня есть рабочий поток, который должен ожидать EDT для обновления GUI перед продолжающимся выполнением. Я использовал опубликовать метод, чтобы сказать EDT изменять что-то. Как я могу заставить рабочего ожидать того изменения для происхождения?
Если тот же рабочий поток инициирует изменения GUI, то существует готовый механизм для ожидания этих изменений:
SwingUtilities.invokeAndWait()
должен подойти.
Другой альтернативой может быть использование SwingUtilities.invokeLater(), чтобы дать EDT некоторый код для выполнения, который разбудит ваш поток, когда EDT станет незанятым, т.е. когда он перейдет к выполнению этой задачи. Для этого нужно выполнить invokeLater()
сразу после wait()
и надеяться, что пробуждение от EDI не произойдет до того, как вы выполните wait()
. Однако это не совсем надежно в отношении времени.
Я предполагаю, что вы используете 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);
}
}