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

Execute method periodically in the Vaadin GUI toolkit

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

我正在使用 ScheduledExecutorService:

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

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

这可能吗?

在 Vaadin 中没有 "main thread" 的直接对应物,大部分应用程序逻辑是 运行 在您的 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)方法。