Метод execute периодически в фреймворк Vaadin графический инструментарий


Мне нужно выполнять метод класса каждые 10 секунд, но мне нужно делать это в основном потоке выполнения, потому что я должен обновить вещи на экране.

Я использую ScheduledExecutorService:

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(runnable, 0, 10, TimeUnit.SECONDS);

Runnable runnable= new Runnable() {
    public void run() {
        someStuff();
    }
};

Возможно ли это?

1 2

1 ответ:

В Vaadin нет прямого аналога для "основного потока", большая часть логики приложения выполняется в рабочем потоке вашего движка сервлетов, и вы не можете использовать или резервировать его. Вместо этого вы должны просто изменить состояние пользовательского интерфейса с правильной блокировкой. Начиная с версии 7, Вы должны чаще всего использовать пользовательский интерфейс.access (Runnable) метод, который выполняет изменения пользовательского интерфейса с блокировкой должным образом и автоматически отправляет изменения в браузер, если используется push-соединение или опрос.

Вы можете использовать это с служба исполнителя. Исходя из вашего примера, это будет что-то вроде:

    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

    Runnable runnable= new Runnable() {
        public void run() {
            myUitoBeModified.access(() -> someStuff());
        }
    };
    executor.scheduleAtFixedRate(runnable, 0, 10, TimeUnit.SECONDS);

Обратите внимание, что если ваш метод someStuff() содержит какое-то длительное выполнение, вы, вероятно, получите лучшие результаты, если не будете использовать его в пользовательском интерфейсе.доступ (Runnable) метод и поместить только фактическую модификацию пользовательского интерфейса в пользовательский интерфейс.метод доступа (Runnable).