В моем веб-приложении, основанном на ваадине, у меня есть два класса. А в классе MyTable метод realTimeUpdate постоянно обновляет значения таблиц в секунду. Между тем из метода действия пользователя1 вызывается для редактирования строки таблицы. Когда действие пользователя вызывает метод1, возникает "Исключение параллельной модификации". Какое лучшее решение я могу применить для этой проблемы?
public class MyView extends CustomComponent implements View{
private IndexedContainer container = new IndexedContainer();
private Table table = new Table();
public MyView(){
......
table.setContainerDataSource(container);
}
}
public class MyTable
{
public void method1(Table table)
{
Container container = table.getContainerDataSource();
Iterator<?> iterator = container.getItemIds().iterator();
while (iterator.hasNext())
{
Object itemId = iterator.next();
...... some code to modify table row
}
}
public void realTimeUpdate(Table table)
{
Container container = table.getContainerDataSource();
Iterator<?> iterator = container.getItemIds().iterator();
while (iterator.hasNext())
{
Object itemId = iterator.next();
...... some code to update table values
}
}
}
Ваадин ожидает, что доступ к нему заблокирован должным образом. Поэтому, когда у вас есть внешний поток, изменяющий компоненты Vaadin или другие связанные с Vaadin классы, вы должны использовать UI.access для обеспечения блокировки. Напишите свой метод realTimeUpdate следующим образом:
public void realTimeUpdate(Table table) {
table.getUI().access(new Runnable() {
@Override
public void run() {
Container container = table.getContainerDataSource();
Iterator<?> iterator = container.getItemIds().iterator();
while (iterator.hasNext())
{
Object itemId = iterator.next();
...... some code to update table values
}
}
});
}