我需要每10个secons执行一个类的方法,但我需要在执行的主线程中执行它,因为我必须更新屏幕中的内容。
我正在使用ScheduledExecutorService
:
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(runnable, 0, 10, TimeUnit.SECONDS);
Runnable runnable= new Runnable() {
public void run() {
someStuff();
}
};
这是可能的吗?
答案 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)方法。