在Vaadin GUI工具包中定期执行方法

时间:2018-01-31 15:03:11

标签: java vaadin runnable schedule

我需要每10个secons执行一个类的方法,但我需要在执行的主线程中执行它,因为我必须更新屏幕中的内容。

我正在使用ScheduledExecutorService

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

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

这是可能的吗?

1 个答案:

答案 0 :(得分:2)

Vaadin中没有“主线程”的直接对应物,大多数应用程序逻辑都在Servlet引擎的工作线程中运行,您无法使用或保留它。相反,您应该只使用正确的锁定来修改UI状态。从版本7开始,您通常应该使用UI.access(Runnable)方法,该方法可以正确锁定执行UI修改,并在使用推送连接或轮询时自动将更改发送到浏览器。

您可以将其与执行者服务一起使用。从你的例子中得出它将是:

    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

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

注意,如果你的someStuff()方法包含很长的执行时间,那么如果你将它保留在UI.access(Runnable)方法之外并且只将实际的UI修改放入UI.access中,你可能会得到最好的结果。 (Runnable)方法。