Параллельная модификация контейнера таблицы требований

1

В моем веб-приложении, основанном на ваадине, у меня есть два класса. А в классе 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
concurrentmodification
vaadin7

1 ответ

2

Ваадин ожидает, что доступ к нему заблокирован должным образом. Поэтому, когда у вас есть внешний поток, изменяющий компоненты 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
             }
         }
    });
}
  • 0
    Это предпочтительный способ получения блокировок в Vaadin, но вы также можете использовать VaadinSession.lock (), если вам нужен более точный контроль.
  • 0
    @ Swarne27, ты должен принять этот ответ. Это решило мою похожую проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню